从多个类继承有什么用处?

5

我在论坛上看到一些评论,似乎有人希望能够在c#中继承多个类。为什么你需要这样做呢?我想不到任何用途,但既然有人想要,肯定有原因。


2
大多数情况下,如果你需要多重继承,那么你的设计可能存在一定问题 :) - Petar Minchev
在C++时代,由于缺乏接口,有时需要使用它。 - Philippe Leybaert
2
请查看 多重继承的用途? - Matthew Flaschen
4个回答

3
好的,以下是一个ASP.NET WebForms示例:
我有一个基类,一个Web控件,假设它是一个简单的文本框。
然后我从TextBox继承以提供格式化 - RichTextBox。
然后我想要一个可以拼写检查的文本框 - SpellCheckingTextBox。
如果我需要一个SpellCheckingRichTextBox怎么办?我将不得不再次实现拼写检查或富文本逻辑并从其中一个继承。
实际上,您可以将它们定义为接口:ISpellCheckingTextBox和IRichTextBox,并在SpellCheckingRichTextBox中实现它们。您还可以编写TextBox的扩展方法来完成相同的事情。
多重继承在根本上是有缺陷的,因为它将继承的类视为相等。如果两个基类都有一个ID字段怎么办?

1

人们可能想这样做是因为他们习惯了在C++中这样做。但在C#中是不允许的。从应用程序可维护性的角度来看,我认为这是一件好事。通常情况下,使用多个接口可以达到同样的效果。

如果您有一个基类,其中包含正确设计的抽象方法,并且知道继承对象只需要在该类中定义的方法,则可以拥有一个有效的设计模式,而无需使用MI。


很少有人在C++中实际使用MI。实际上,人们想要使用MI是因为他们不知道如何以正确的方式做到这一点。 - BlueRaja - Danny Pflughoeft

1

“不需要”这个说法过于绝对:是的,接口可以完成MI提供的大部分功能,但Mixin为组合正交行为策略提供了强大的惯用语。然而,这种强大是否值得“死亡之钻”的麻烦则是另一个问题。 - Pontus Gagge

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
}

就我个人而言,如果没有冲突,或者有冲突处理机制,那么不能进行多重继承,我认为这是一件遗憾,但这就是现实。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接