实际上这里有三个问题捆绑在一起:(1)支持多重继承对正交性的影响是什么? (2)实现多个接口对正交性的影响是什么? (3)这两种影响有什么区别?
首先,让我们来看看正交性。在Unix编程的艺术中,Eric Raymond解释说:“在纯正交设计中,操作没有副作用;每个操作(无论是API调用,宏调用还是语言操作)都会改变一件事而不会影响其他操作。只有一种方法可以改变你所控制的任何系统的每个属性。“
所以,现在看问题(1)。 C++支持多重继承,因此C++中的类可以继承两个具有相同操作但具有两种不同效果的类。这有可能是非正交的,但C++要求您明确指出哪个父类具有要调用的功能。这会将操作限制为只有一种效果,因此维持正交性。见Multiple inheritance.
问题(2)。 Java不允许多重继承。一个类只能从一个基类派生。接口用于编码各种类型共享的相似性,但不一定构成类关系。 Java类可以实现多个接口,但只有一个类正在执行,因此调用方法时应该只有一个效果。即使一个类实现了两个接口,它们都有一个具有相同名称和签名的方法,它将同时实现两个方法,所以应该只有一个作用。见Java interface.
最后问题(3)。不同之处在于C++和Java通过不同的机制保持正交性:C++通过要求明确指定父级,所以在效果中不会有歧义;和Java通过同时实现类似的方法,所以只有一个效果。