爲什麼C#以這種方式設計,並且能夠從無限類派生的缺點是什麼? (我知道你可以在大多數情況下使用接口)爲什麼我不能從多個類派生?
回答
多重繼承導致Diamond Problem。
「鑽石問題」(有時稱爲「致命的死亡鑽石」)是當B和C兩個類從A繼承而來,並且D從B和C繼承時產生的模糊性。 A中有一個方法,B和C已經被覆蓋,並且D沒有覆蓋它,那麼D繼承的方法的哪個版本:B的方法還是C的方法?例如,在GUI軟件開發的上下文中,類Button可能繼承於類Rectangle(用於外觀)和Clickable(用於功能/輸入處理),而類Rectangle和Clickable都從Object類繼承。現在,如果爲Button對象調用equals方法並且Button類中沒有這樣的方法,但是在Rectangle或Clickable(或兩者)中存在重寫的equals方法,哪種方法應該最終調用?
由於在這種情況下類繼承圖的形狀,它被稱爲「鑽石問題」。在這種情況下,A級位於頂部,B和C都位於頂部,D將底部的兩個位置連接在一起形成菱形。
另外,從C#開發團隊:
的地方MI是真正合適的數量實際上是相當小的。在很多情況下,多接口繼承可以完成工作。在其他情況下,您可能能夠使用封裝和委派。如果我們要添加一個稍微不同的構造,比如mixin,它會更強大嗎?
多實現繼承爲實現注入了很多複雜性。這種複雜性會影響到投射,佈局,調度,字段訪問,序列化,身份比較,可驗證性,反射,泛型以及其他許多地方。
Link。
完美答案先生 –
高度評價的答案...因爲事情會變得時髦。
public class Goose
{
public Wings MyWings {get;set;}
public void Eat()
{
//.. eat before flying
}
public void Fly()
{
//.. flap wings
}
}
public class Airplane
{
public Engine MyEngine {get;set;}
public void FuelUp()
{
//.. fuel up before flying
}
public void Fly()
{
//.. start engine and accelerate
}
}
public class SpruceGoose: Goose, Airplane
{
public void SomeMethod()
{
this.Fly(); // do I flap my wings?
// or do I start my engine and accelerate
// or do I do both? which one first
// do I eat? or do I fuel up?
}
}
- 1. 爲什麼我的派生類不能傳遞給基類?
- 2. 爲什麼我的向量不能識別我的派生類?
- 3. 爲什麼委託類型是從MulticastDelegate類派生的,爲什麼不直接從委託類派生?
- 4. 爲什麼一個Struct不能從另一個結構派生?
- 5. 爲什麼MovieClip派生類不會gotoAndStop?
- 6. 爲什麼ObjectContext類不是從某個接口派生的?
- 7. 爲什麼我們不能序列化從接口派生的具體類?
- 8. 爲什麼派生類不能引用基類?
- 9. 爲什麼派生類不能訪問基類靜態方法?
- 10. 爲什麼我的派生類是一個抽象類? C++
- 11. 爲什麼TextElemt類不是從Control類派生的?
- 12. 爲什麼不能將多態派生類嵌套在基類中?
- 13. 爲什麼我無法從System.Enum抽象類派生?
- 14. C++爲什麼我得到這個派生類的錯誤
- 15. 爲什麼建議從Python派生Exception而不是BaseException類?
- 16. 爲什麼有些MFC類不是從CObject派生的?
- 17. 從QAbstractTableModel派生類中刪除行不起作用,爲什麼?
- 18. 爲什麼我不能訪問從類
- 19. 爲什麼我們不能從父類
- 20. 爲什麼我們不能覆蓋靜態方法在派生類中
- 21. 爲什麼我不能強制派生類具有無參數構造函數?
- 22. 爲什麼異步方法返回類型不能從任務派生?
- 23. 不能從派生類型的範圍
- 24. 「System.ComponentModel.PropertyChangedEventHandler」不能從特殊類派生「System.MulticastDelegate」
- 25. 爲什麼在派生類中找不到基類成員C++
- 26. 如果我從泛型類派生非泛型類,會發生什麼類型?
- 27. 不能在派生類中
- 28. 爲什麼我的基類指針變量不能從派生類訪問函數?
- 29. 爲什麼GHC不能爲Monoid派生實例?
- 30. 爲什麼這個派生類的行爲不同,它的基類
https://stackoverflow.com/questions/2456154/does-c-sharp-support-multiple-inheritance – Amit