7

我正在阅读Andrew Hunt 和 David Thomas所著的实用程序员:从熟练工到大师。当我读到一个叫做正交性的术语时,我认为我做对了。我非常了解它。然而,在本章的最后,提出了几个问题来衡量对该主题的理解程度。当我试图对自己回答这些问题时,我意识到我并没有完全理解它。因此,为了澄清我的理解,我在这里提出这些问题。

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

4

2 回答 2

10

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

首先,让我们掌握正交性。在 The Art of Unix Programming 中,Eric Raymond 解释说:“在纯粹的正交设计中,操作没有副作用;每个操作(无论是 API 调用、宏调用还是语言操作)只改变一件事而不会影响其他操作. 改变你所控制的任何系统的每个属性的方法只有一种。”

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

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

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

于 2012-07-11T16:46:31.893 回答
0

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

于 2016-05-26T19:12:07.527 回答