C#是否支持多重继承?

Nei*_*ght 55 c# multiple-inheritance

我和一位同事对多重继承有一点争论.我说它不受支持,而且他说的是.所以,我以为我会问网上那些聪明的人.

Asa*_*sad 88

对不起,你不能继承multiple classes.您可以使用接口或其组合one class and interface(s),其中接口应在签名中跟随类名.

interface A { }
interface B { }
class Base { }
class AnotherClass { }
Run Code Online (Sandbox Code Playgroud)

可能的继承方式:

class SomeClass : A, B { } // from multiple Interface(s)
class SomeClass : Base, B { } // from one Class and Interface(s)
Run Code Online (Sandbox Code Playgroud)

这不合法:

class SomeClass : Base, AnotherClass { }
Run Code Online (Sandbox Code Playgroud)

  • +1用于区分实现继承和接口继承 (5认同)
  • +1是一个清晰的代码示例。一幅图片说出1000个单词,不确定一个代码示例说了多少……但这还是不错的。 (3认同)

Bar*_*der 43

不,请改用接口!^.^

  • -1因为:你不能从接口做"多重继承",你可以"实现"多个接口 - 这是一个完全不同的概念.对问题的简短回答是3.5,你不能在C#中做多重继承 (26认同)
  • 支持接口与多重继承不同. (17认同)
  • 当然,作为高级.Net开发人员,你可以告诉他答案:= P. (9认同)
  • **单独的接口并不能代替多重继承**,有很多问题会让你的编码成为噩梦,请参阅我对主要答案的评论. (7认同)
  • 请注意,您可以编写接口的扩展方法,这有助于共享实现代码. (5认同)
  • 接口不能替代继承。这对刚接触 C# 的人来说是非常误导的。在尝试使用它们作为替代方案时,您将做不必要的重复工作,因为无论如何每个“子”类都必须新实现“父”接口的成员,那么您获得了什么?Liviu M 的答案与多重继承最接近,但更好,因为与多重继承相比,您可以使类保持更松散的耦合。 (2认同)

Liv*_* M. 20

C#不支持多重继承.

但是如果你想从两个来源"继承"行为,为什么不使用组合:

  • 组成

  • 依赖注入

有一个基本但重要的OOP原则说:"赞成组合而不是继承".

你可以创建一个这样的类:

public class MySuperClass
{
    private IDependencyClass1 mDependency1;
    private IDependencyClass2 mDependency2;

    public MySuperClass(IDependencyClass1 dep1, IDependencyClass2 dep2)
    {
        mDependency1 = dep1;
        mDependency2 = dep2;
    }

    private void MySuperMethodThatDoesSomethingComplex()
    {
        string s = mDependency1.GetMessage();
        mDependency2.PrintMessage(s);
    }
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,依赖项(接口的实际实现)是通过构造函数注入的.您的类不知道每个类是如何实现的,但它知道如何使用它们.因此,这里涉及的类之间存在松散耦合但具有相同的使用功率.

今天的趋势表明,继承是一种"时尚".

  • 这是正确的答案。说你可以用接口做到这一点的答案并不理解接口。接口是类型约束。它们与继承无关。您仍然需要实现接口的每个成员,那么您继承了什么?还有 +1 用于寻址 - 至少有一点 - 为什么多重继承可能不是你想要的。 (2认同)

Gno*_*ght 13

C#3.5或更低版本不支持多重继承,但C#4.0可以通过使用我记忆中的动态来实现.

  • 有趣的功能......这里有一篇关于http://www.codingday.com/multiple-inheritance-in-c-using-dynamic-features/的文章 (3认同)
  • 虽然我不建议使用这个,但我会提供一个聪明的想法. (2认同)
  • @tbischel请务必记下该文章的最后评论.提供的示例似乎不起作用. (2认同)
  • 虽然这**可能会起作用,但它实际上非常难看,并且需要在运行时进行大量反射才能完成工作.我永远不会在生产代码中允许这样的解决方案. (2认同)

Sun*_*nny 7

你不能在C#到3.5之前做多重继承.我不知道它是如何在4.0上运行的,因为我没有看过它,但@tbischel发布了一个我需要阅读的链接.

C#允许你通过接口进行"多重实现",这与"多重继承"完全不同

所以,你做不到:

class A{}

class B{}

class C : A, B{}
Run Code Online (Sandbox Code Playgroud)

但是,你可以这样做:

interface IA{}
interface IB{}

class C : IA, IB{}
Run Code Online (Sandbox Code Playgroud)

HTH


ser*_*0ne 6

C#不支持类的多重继承,但是允许您继承/实现任意数量的接口。

这是非法的 (B,C,D和E都是类)

class A : B, C, D, E
{
}
Run Code Online (Sandbox Code Playgroud)

这是合法的 (IB,IC,ID和IE均为接口)

class A : IB, IC, ID, IE
{
}
Run Code Online (Sandbox Code Playgroud)

这是合法的 (B是类,IC,ID和IE是接口)

class A : B, IC, ID, IE
{
}
Run Code Online (Sandbox Code Playgroud)

组合而不是继承是一种设计模式,即使在支持多重继承的语言中,这种设计模式似乎也是有利的。