實際上這裏有三個問題捆綁在一起:(1)支持多重繼承對正交性的影響是什麼? (2)實現多個接口對正交性的影響是什麼? (3)這兩種影響有什麼區別?
首先,讓我們來看看正交性。在Unix編程的藝術中,Eric Raymond解釋說:「在純正交設計中,操作沒有副作用;每個操作(無論是API調用,宏調用還是語言操作)都會改變一件事而不會影響其他操作。只有一種方法可以改變你所控制的任何系統的每個屬性。「
所以,現在看問題(1)。 C++支持多重繼承,因此C++中的類可以繼承兩個具有相同操作但具有兩種不同效果的類。這有可能是非正交的,但C++要求您明確指出哪個父類具有要調用的功能。這會將操作限制爲只有一種效果,因此維持正交性。見Multiple inheritance.
問題(2)。 Java不允許多重繼承。一個類只能從一個基類派生。接口用於編碼各種類型共享的相似性,但不一定構成類關係。 Java類可以實現多個接口,但只有一個類正在執行,因此調用方法時應該只有一個效果。即使一個類實現了兩個接口,它們都有一個具有相同名稱和簽名的方法,它將同時實現兩個方法,所以應該只有一個作用。見Java interface.
最後問題(3)。不同之處在於C++和Java通過不同的機制保持正交性:C++通過要求明確指定父級,所以在效果中不會有歧義;和Java通過同時實現類似的方法,所以只有一個效果。