我正在阅读The Pragmatic Programmer: From Journeyman to Master by Andrew Hunt, David Thomas。当我读到一个叫做正交性的术语时,我以为我做对了。我非常了解它。但是,在本章的末尾,提出了一些问题来衡量对该主题的理解水平。当我试图对自己回答这些问题时,我意识到自己还不太了解。因此,为了澄清我的理解,我在这里问这些问题。
C ++支持多重继承,而Java允许类
实现多个接口。使用这些设施有什么影响
有正交性吗?使用多个之间的影响有区别吗
继承和多个接口?
最佳答案
这里实际上捆绑了三个问题:(1)支持多重继承对正交性有何影响? (2)实现多个接口对正交性有何影响? (3)两种影响有什么区别?
首先,让我们把握正交性。在Unix编程的艺术中,埃里克·雷蒙德(Eric Raymond)解释说:“在纯正交设计中,操作没有副作用;每个操作(无论是API调用,宏调用还是语言操作)仅改变一件事而不会影响其他事情。只有一种方法可以更改您所控制的任何系统的每个属性。”
因此,现在看问题(1)。 C ++支持多重继承,因此C ++中的类可以从两个具有相同操作但具有两种不同效果的类继承。这有可能是非正交的,但是C ++要求您明确声明哪个父类具有要调用的功能。这会将操作限制为仅一种效果,因此可以保持正交性。见Multiple inheritance.
和问题(2)。 Java不允许多重继承。一类只能从一个基类派生。接口用于编码各种类型的类共享的相似性,但不一定构成类关系。 Java类可以实现多个接口,但是只有一个类可以实现,因此调用一种方法时应该只有一种效果。即使一个类实现了两个接口,两个接口都具有一个具有相同名称和签名的方法,它也会同时实现这两个方法,因此应该只有一个效果。见Java interface.
最后是问题(3)。区别在于C ++和Java通过不同的机制保持正交性:C ++通过明确要求指定父级来实现,因此在效果上不会产生歧义。和Java可以同时实现类似的方法,因此只有一种效果。
关于multiple-inheritance - 使用这些工具对正交性有什么影响?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11433286/