2012-07-11 104 views
3

我在阅读The Pragmatic Programmer: From Journeyman to Master by Andrew Hunt, David Thomas。当我读到关于正交性的术语时,我在想我正确地做到了。我对此非常了解。然而,在本章最后,有人问了几个问题来衡量对这个问题的理解程度。当我试图回答这些问题时,我意识到我还没有完全理解它。为了澄清我的理解,我在这里提出这些问题。使用这些设施对正交性有什么影响?

C++支持多重继承,而Java允许一个类实现多个接口。 使用这些设施 对正交性有什么影响?使用多个 继承和多个接口之间有什么不同?

回答

6

实际上这里有三个问题捆绑在一起:(1)支持多重继承对正交性的影响是什么? (2)实现多个接口对正交性的影响是什么? (3)这两种影响有什么区别?

首先,让我们来看看正交性。在Unix编程的艺术中,Eric Raymond解释说:“在纯正交设计中,操作没有副作用;每个操作(无论是API调用,宏调用还是语言操作)都会改变一件事而不会影响其他操作。只有一种方法可以改变你所控制的任何系统的每个属性。“

所以,现在看问题(1)。 C++支持多重继承,因此C++中的类可以继承两个具有相同操作但具有两种不同效果的类。这有可能是非正交的,但C++要求您明确指出哪个父类具有要调用的功能。这会将操作限制为只有一种效果,因此维持正交性。见Multiple inheritance.

问题(2)。 Java不允许多重继承。一个类只能从一个基类派生。接口用于编码各种类型共享的相似性,但不一定构成类关系。 Java类可以实现多个接口,但只有一个类正在执行,因此调用方法时应该只有一个效果。即使一个类实现了两个接口,它们都有一个具有相同名称和签名的方法,它将同时实现两个方法,所以应该只有一个作用。见Java interface.

最后问题(3)。不同之处在于C++和Java通过不同的机制保持正交性:C++通过要求明确指定父级,所以在效果中不会有歧义;和Java通过同时实现类似的方法,所以只有一个效果。

0

无论您扩展的接口/类是多少,该类中只有一个实现。假设你的班级是X. 现在正交性说 - 一个变化只应该影响一个模块。 如果您在类X中更改了一个接口的实现 - 是否会影响使用您的类X的其他模块/类?答案是否定的 - 因为其他模块/类是由接口编码而不是实现。 因此保持正交性。

相关问题