使用这些设施对正交性有何影响?

时间:2012-07-11 13:03:27

标签: multiple-inheritance conceptual orthogonal

我正在阅读The Pragmatic Programmer: From Journeyman to Master by Andrew Hunt, David Thomas。当我读到一个名为 orthogonality 的术语时,我在想我正确的做法。我很了解它。然而,在本章的最后,提出了一些问题来衡量对该主题的理解程度。当我试图回答这些问题时,我意识到我并没有完全理解它。所以为了澄清我的理解,我在这里问这些问题。

  

C ++支持多重继承,而Java允许一个类   实现多个接口。 使用这些设施会产生什么影响   有正交性吗?使用多个之间的影响是否存在差异   继承和多个接口?

2 个答案:

答案 0 :(得分:7)

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

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

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

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

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

答案 1 :(得分:0)

无论您扩展任何数量的接口/类,该类中只有一个实现。让我们说你的班级是X. 现在,正交性说 - 一个变化应该只影响一个模块。 如果你在X类中改变一个接口的实现 - 它会影响使用你的类X的其他模块/类吗?答案是否定的 - 因为其他模块/类是按接口编码而不是实现。 因此保持了正交性。