2010-06-01 45 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 
} 

我个人认为这是一个耻辱,你不能有多重继承如果没有冲突,或有冲突处理机制,但他们是在休息。