我在論壇上看到了一些評論,似乎人們希望能夠從c#中的多個類繼承。爲什麼你會需要這個?我想不出有什麼用處,但因爲有人需要它,所以必須有一些。從多個類繼承的用途是什麼?
回答
嗯,這裏是一個ASP.NET的WebForms例如:
我有一個基類,網絡控制,讓我們說這是一個簡單的TextBox
。我接着從TextBox
繼承提供格式 - RichTextBox
。
然後我想要一個TextBox
,可以拼寫檢查 - SpellCheckingTextBox
。
如果我需要SpellCheckingRichTextBox
該怎麼辦?我將不得不再次執行拼寫檢查或富文本邏輯並從其中繼承。
實際上,您可以將它們定義爲接口:ISpellCheckingTextBox
和IRichTextBox
,並在SpellCheckingRichTextBox
中實施它們。你也可以寫TextBox
的擴展方法來完成同樣的事情。
多繼承基本上存在缺陷,因爲它將繼承的類視爲平等。如果兩個基類都有ID
字段會怎麼樣?
人們可能想要這樣做,因爲他們習慣於用C++來做到這一點。它在C#中是不允許的。從應用程序維護性的角度來看,IMO是一件好事。通常情況下,使用多個接口將完成同樣的事情。如果你有一個抽象方法設計正確的基類,而且知道繼承對象只需要在該類中定義的方法,那你就有了一個有效的不需要MI的設計模式。
很少有人在C++中使用MI。真的,人們想要使用MI,因爲他們不知道如何以正確的方式做到這一點。 – 2010-06-01 22:09:25
C++(和其他語言)有時會使用多繼承來允許類從多個基類繼承屬性和代碼。當你有接口時,比如在C#和Java中,實際上不需要多繼承,所以它沒有在這些語言中實現。
下面是埃菲爾鐵塔上的多重繼承的好文章:
http://archive.eiffel.com/doc/manuals/technology/bmarticles/joop/multiple.html
「不需要」是超強的:是的,接口完成了MI所提供的大部分功能,但mixin爲組合正交行爲策略提供了強大的成語。這種力量是否值得「死亡鑽石」的麻煩是另一個問題。 – 2010-06-01 13:36:39
想要在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
}
我個人認爲這是一個恥辱,你不能有多重繼承如果沒有衝突,或有衝突處理機制,但他們是在休息。
大多數情況下,如果你需要多重繼承,那麼你的設計可能有些不正確:) – 2010-06-01 11:28:33
在C++的日子裏,有時你需要它,因爲缺少接口 – 2010-06-01 11:32:06
請參閱[用於多重繼承?] http://stackoverflow.com/questions/573913/a-use-for-multiple-inheritance) – 2010-06-01 12:22:16