2010-06-01 44 views
5

我在論壇上看到了一些評論,似乎人們希望能夠從c#中的多個類繼承。爲什麼你會需要這個?我想不出有什麼用處,但因爲有人需要它,所以必須有一些。從多個類繼承的用途是什麼?

+2

大多數情況下,如果你需要多重繼承,那麼你的設計可能有些不正確:) – 2010-06-01 11:28:33

+0

在C++的日子裏,有時你需要它,因爲缺少接口 – 2010-06-01 11:32:06

+2

請參閱[用於多重繼承?] http://stackoverflow.com/questions/573913/a-use-for-multiple-inheritance) – 2010-06-01 12:22:16

回答

3

嗯,這裏是一個ASP.NET的WebForms例如:

我有一個基類,網絡控制,讓我們說這是一個簡單的TextBox。我接着從TextBox繼承提供格式 - RichTextBox

然後我想要一個TextBox,可以拼寫檢查 - SpellCheckingTextBox

如果我需要SpellCheckingRichTextBox該怎麼辦?我將不得不再次執行拼寫檢查或富文本邏輯並從其中繼承。

實際上,您可以將它們定義爲接口:ISpellCheckingTextBoxIRichTextBox,並在SpellCheckingRichTextBox中實施它們。你也可以寫TextBox的擴展方法來完成同樣的事情。

多繼承基本上存在缺陷,因爲它將繼承的類視爲平等。如果兩個基類都有ID字段會怎麼樣?

1

人們可能想要這樣做,因爲他們習慣於用C++來做到這一點。它在C#中是不允許的。從應用程序維護性的角度來看,IMO是一件好事。通常情況下,使用多個接口將完成同樣的事情。如果你有一個抽象方法設計正確的基類,而且知道繼承對象只需要在該類中定義的方法,那你就有了一個有效的不需要MI的設計模式。

+0

很少有人在C++中使用MI。真的,人們想要使用MI,因爲他們不知道如何以正確的方式做到這一點。 – 2010-06-01 22:09:25

1

C++(和其他語言)有時會使用多繼承來允許類從多個基類繼承屬性和代碼。當你有接口時,比如在C#和Java中,實際上不需要多繼承,所以它沒有在這些語言中實現。

下面是埃菲爾鐵塔上的多重繼承的好文章:

http://archive.eiffel.com/doc/manuals/technology/bmarticles/joop/multiple.html

+0

「不需要」是超強的:是的,接口完成了MI所提供的大部分功能,但mixin爲組合正交行爲策略提供了強大的成語。這種力量是否值得「死亡鑽石」的麻煩是另一個問題。 – 2010-06-01 13:36:39

0

想要在C#中使用它的一個合理案例是創建派生對象MarshalByRef。例如,說我要做到以下幾點:

public class FooCorpClass 
{ 
    // This class is defined in a 3rd party library and thus can't be changed 
} 

public class MyFoo : FooCorpClass, MarshalByRef 
{ 
    // I can't do this because MarshalByRef isnt' an interface 
} 

我個人認爲這是一個恥辱,你不能有多重繼承如果沒有衝突,或有衝突處理機制,但他們是在休息。