我在论坛上看到了一些评论,似乎人们希望能够从c#中的多个类继承。你为什么要这个?我想不出有什么用处,但是因为有人想要它,所以必须有一些。
答案 0 :(得分:3)
嗯,这是一个ASP.NET WebForms示例:
我有一个基类,一个网络控件,让我们说这是一个简单的TextBox
。
然后我继承TextBox
以提供格式化 - RichTextBox
。
然后,我想要一个可以拼写检查的TextBox
- SpellCheckingTextBox
。
如果我需要SpellCheckingRichTextBox
怎么办?我必须再次实现拼写检查或富文本逻辑,并从一个或另一个继承。
实际上,您可以将它们定义为接口:ISpellCheckingTextBox
和IRichTextBox
,并在SpellCheckingRichTextBox
中实现它们。您还可以为TextBox
编写扩展方法来完成同样的事情。
多重继承从根本上是有缺陷的,因为它将继承的类视为相等。如果两个基类都有ID
字段会怎么样?
答案 1 :(得分:1)
人们可能想要这样做,因为他们习惯于在C ++中这样做。它不允许在C#中。从应用程序可维护性的角度来看,IMO是一件好事。通常,使用多个接口将完成相同的任务.n
如果您的基类具有正确设计的抽象方法,并且知道继承对象只需要该类中定义的方法,那么您就拥有了不需要MI的有效设计模式。
答案 2 :(得分:1)
有时在C ++(和其他语言)中使用多重继承,以允许类从多个基类继承属性和代码。当你有接口时,比如在C#和Java中,实际上不需要多重继承,所以它没有用这些语言实现。
这是一篇关于艾菲尔中多重继承的好文章:
http://archive.eiffel.com/doc/manuals/technology/bmarticles/joop/multiple.html
答案 3 :(得分: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
}
我个人认为,如果没有碰撞,或者有碰撞处理机制,你不能拥有多重继承,这是一种耻辱,但它们就是休息。