2017-08-30 80 views
-2

爲什麼C#以這種方式設計,並且能夠從無限類派生的缺點是什麼? (我知道你可以在大多數情況下使用接口)爲什麼我不能從多個類派生?

+0

https://stackoverflow.com/questions/2456154/does-c-sharp-support-multiple-inheritance – Amit

回答

1

多重繼承導致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將底部的兩個位置連接在一起形成菱形。

Diamong diagram

另外,從C#開發團隊:

的地方MI是真正合適的數量實際上是相當小的。在很多情況下,多接口繼承可以完成工作。在其他情況下,您可能能夠使用封裝和委派。如果我們要添加一個稍微不同的構造,比如mixin,它會更強大嗎?

多實現繼承爲實現注入了很多複雜性。這種複雜性會影響到投射,佈局,調度,字段訪問,序列化,身份比較,可驗證性,反射,泛型以及其他許多地方。

Link

+0

完美答案先生 –

-1

高度評價的答案...因爲事情會變得時髦。

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? 
    } 
} 
相關問題