C#支持多inheritance吗?

我和一个同事对多重inheritance有一点争论。 我说这不是支持,他说的是。 所以,我想我会问networking上的一群聪明人。

不,请使用接口! ^。^

对不起,你不能inheritancemultiple classes 。 您可以使用接口或者one class and interface(s)的组合,其中接口应该在签名中跟随类名称。

  interface A { } interface B { } Class Base {} Class AnotherClass {} 

可能的方法来inheritance:

 class SomeClass : A, B { } // from multiple Interface(s) class SomeClass : Base, B { } // from one Class and Interfacce(s) 

这不合法:

 class SomeClass : Base, AnotherClass { } 

C#3.5或更低版本不支持多重inheritance,但C#4.0可以通过使用(如我记得的)Dynamics来实现。

C#中不支持多inheritance。

但是,如果你想从两个来源“inheritance”行为,为什么不使用组合:

  • 组成

  • dependency injection

有一个基本的,但重要的面向对象的原则,说:“赞成组合inheritance”。

你可以像这样创build一个类:

 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); } } 

正如你所看到的依赖(接口的实际实现)是通过构造函数注入的。 你不知道每个类是如何实现的,但它知道如何使用它们。 因此,这里涉及的类之间的松散耦合,但是使用相同的能力。

今天的趋势表明,inheritance有点“过时”。

在C#中,你不能做多重inheritance,直到3.5。 我不知道它是如何工作在4.0,因为我没有看过,但@tbischel已经发布了一个链接,我需要阅读。

C#允许您通过接口完成“多重实现”,这与“多重inheritance”

所以,你不能这样做:

 class A{} class B{} class C : A, B{} 

但是,你可以这样做:

 interface IA{} interface IB{} class C : IA, IB{} 

HTH

像Java(这是C#间接从中派生出来的),C#不支持多重Inhertance。

也就是说,类数据 (成员variables和属性)只能从一个父基inheritance。 另一方面,类行为 (成员方法)可以从多个父基接口inheritance。

一些专家,特别是Bertrand Meyer (被某些人认为是面向对象编程的父亲之一)认为这使得C#(和Java以及其他所有人)不能成为“真正的”面向对象的语言。

其实,这取决于你的inheritance定义:

  • 你可以从一个类inheritance实现 (成员,即数据和行为),但是
  • 你可以从多个 接口inheritance接口。

这不是“inheritance”一词的意思,但是用这种方式来定义它也并不是完全不合理的。

它不允许使用接口来实现它。

为什么是这样?

答案是这样的:编译器可以做出一个非常理性和理性的决定,它始终保持一致,关于什么是被inheritance的以及从哪里inheritance的,这样当你执行了转换时,你总是知道你正在处理的是哪个实现。

一般来说,你不能这样做。

考虑这些接口和类:

 public class A { } public class B { } public class C { } public interface IA { } public interface IB { } 

您可以inheritance多个接口:

 class A : B, IA, IB { // Inherits any single base class, plus multiple interfaces. } 

但是你不能inheritance多个

 class A : B, C, IA, IB { // Inherits multiple base classes, plus multiple interfaces. } 

C#不支持类的多重inheritance,但您可以inheritance/实现任意数量的接口。

这是非法的 (B,C,D&E都是class级)

 class A : B, C, D, E { } 

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

 class A : IB, IC, ID, IE { } 

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

 class A : B, IC, ID, IE { } 

inheritance构成是一种devise模式,即使在支持多重inheritance的语言中也是如此。

您可能需要进一步说明您的观点,并谈论devise模式 – 您可以了解为什么他想要尝试从C#中的多个类inheritance,如果他甚至可以

多inheritance允许程序员创build结合多个类的方面和它们相应的层次结构的类。 例如。 C ++允许你从多个类inheritance

在C#中,类只允许从单个父类inheritance,这被称为单inheritance。 但是您可以使用接口或者一个类和接口的组合,其中接口应该在签名中跟随类名称。

例如:

 Class FirstClass { } Class SecondClass { } interface X { } interface Y { } 

你可以inheritance如下:

class NewClass:X,Y {}在上面的代码中,类“NewClass”是从多个接口创build的。

类NewClass:FirstClass,X {}在上面的代码中,类“NewClass”是从接口X和类“FirstClass”创build的。

一次不能inheritance多个类。 但有一个选项可以通过界面的帮助来做到这一点。 看下面的代码

 interface IA { void PrintIA(); } class A:IA { public void PrintIA() { Console.WriteLine("PrintA method in Base Class A"); } } interface IB { void PrintIB(); } class B : IB { public void PrintIB() { Console.WriteLine("PrintB method in Base Class B"); } } public class AB: IA, IB { A a = new A(); B b = new B(); public void PrintIA() { a.PrintIA(); } public void PrintIB() { b.PrintIB(); } } 

你可以打电话给他们如下

 AB ab = new AB(); ab.PrintIA(); ab.PrintIB(); 

作为对build议的另一个build议,提供类似于多重inheritancefunction的另一个聪明的方法是实现多个接口,然后在这些接口上提供扩展方法。 这叫做mixins 。 这不是一个真正的解决scheme,但它有时会处理会提示您要执行多重inheritance的问题。

C#不支持内置的多重inheritance。

要将多重inheritance添加到不支持的语言,可以使用双devise模式