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模式
http://www.codeproject.com/KB/architecture/smip.aspx
多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模式