2011-04-28 109 views
0

是否有任何語言允許同時繼承兩個或更多類?是否有允許同時繼承兩個或更多類的任何語言?

我知道PHP和Java不允許這樣做。我猜其他語言也不允許這樣做。但爲什麼?我認爲這會非常有用。這裏的代碼(這不是任何語言的語法是否正確),說明我的意思......

class X extends Y, Z { 

} 

如果有可能,類X將具有Y和Z都字段和方法。

回答

4

C++允許多重繼承。

可以由Bjarne Stroustrup的,C++的創作者在文章中讀出這個功能here的完整說明。

但它不是銀彈您所有的問題。多重繼承通常會產生比解決問題更多的問題。如果你發佈了一個問題來解釋你試圖用你選擇的語言來達到什麼目的,也許你可以得到更好的建議?

我當然不會建議學習C++只是爲了利用多重繼承。

+0

我現在沒有任何具體問題。我只是覺得它會有用...有時。你能解釋一下「更多問題」是什麼意思嗎? – daGrevis 2011-04-28 11:50:20

+0

@daGrevis:http://en.wikipedia.org/wiki/Diamond_problem是一個經典的答案。但除此之外,隨着繼承的不斷髮展,情況開始變得複雜起來。 10次​​中的9次,有更好的解決方案,不涉及多重繼承。在像C#這樣的語言中,執行決定認爲該特性實現比通常有用的更復雜,因此完全從語言中省略。經驗證據表明,很少有程序員錯過它。 – 2011-04-28 11:53:50

1

想象一下,你有兩個屬性/在兩個Y和Z類相同名稱的方法,所以編譯器不知道哪個階級屬性/方法必須被繼承。

*在Java中,您可以使用Interfaces進行多重繼承。

+0

我認爲這應該是邏輯,X先從Y繼承,然後從Z.Z比Y高,因爲它在Y之後。所以如果兩個(Y和Z)都有,例如,相同的方法,最後,X會有Z方法。 – daGrevis 2011-04-28 11:58:44

+0

@daGrevis:嗯,這是一個有趣的方法。在我熟悉的語言(C++)中,當涉及到繼承時,沒有「排序」的概念。然而,看起來你所描述的正是Perl如何處理這個問題,需要你在有序列表中指定繼承類。在我看來,這是一個奇怪的模型,但解決鑽石問題的方法有很多。 – 2011-04-29 00:43:03

+0

有趣。我認爲這是如此的邏輯。 = D感謝您的回答! – daGrevis 2011-04-29 10:15:44

0

的Python:

class DerivedClassName(Base1, Base2, Base3): 
<statement-1> 
. 
. 
. 
<statement-N> 

Python tutorial 9.5.1。多繼承

6

多重繼承是由下列語言支持:

Perl中,Perl 6中,Python和C++,捲曲,迪倫,艾菲爾,Logtalk,對象REXX,OCaml中,和Tcl 另外斯卡拉(通過使用混入類)和PHP(通過使用traits類的)

和良好知道

有些語言,如C#,Java和Ruby的實現單繼承雖然協議,或接口,提供一些真正的多重繼承的功能。