2015-08-30 72 views
2

我有這個困惑很久。許多人說我們可以通過像C#或Java這樣的語言來實現多重繼承,但不像C++那樣支持它。但是我對繼承和接口的理解卻說不。因爲接口是合同來驗證與行爲無關的實現。接口定義了什麼可以做(不是什麼東西)。但繼承是繼承父母的行爲和/或財產(例如,孩子正在從父母那裏獲得一些基因行爲 - 這是繼承)。現在孩子正在學習一門技巧,比如說繪畫和烹飪,而界面(證書或合同)就是驗證孩子是否擁有這樣的技能(這是孩子可以做的,而不是他從父母那裏得到的東西 - 這就是不是繼承)真的可以用接口來實現多重繼承嗎

所以我理解錯了嗎?如果不是那麼爲什麼它說我們可以使用接口實現多重繼承?

+0

http:// stackoverflow。com/questions/3556652/how-do-java-interfaces-simulate-multiple-inheritance選中此鏈接。它可能有幫助 – Saud

回答

3

接口給你一個類型的多重繼承,但不是行爲。實現ListMap的類是「ListMap」,但是實現與任何現有的ListMap實現沒有任何關係(必然)。

當然,使用成分(應反正青睞),你可以很容易地創建相應其listmap性能ListMap其代表的呼籲,同時提供將結合各自的數據大概是一些有用的功能。

由於Java 8接口允許使用默認方法,所以行爲的繼承現在也成爲可能。

0

在Java中,您可以創建一個接口,例如Animal和抽象類Bird

那麼你可以有一個MockingBird類,它擴展了Bird的行爲並實現了Animal的操作。

然而,就可以解決MockingBird作爲Animal或作爲Bird因爲它「繼承」從兩個

0

不行,接口不能用來實現多重繼承

沒有在Java中所有,在C#中,我們可以得到接近。

我研究這個問題時,我想實現一個觀察者,並在羅伯特·馬丁的博客結束了:http://blog.cleancoder.com/uncle-bob/2015/01/08/InterfaceConsideredHarmful.html

閱讀這篇文章,我意識到他在談論的Java之後,但C#支持擴展方法,讓你可以連接在界面上的行爲,所以我試圖讓我在一些IObservable接口上實現,但顯然失敗了,即使我可以將行爲附加到這些接口擴展方法中,我仍然不允許在它們上附加狀態,如果某天微軟決定實施extension properties那麼這種組合(接口+擴展方法+擴展屬性)可能足以真正模擬一些有用的多重繼承。

現在,我們被困在博客中所述的所有觀察者中的代碼或代碼重複。