如何使用接口克服C#中的多重inheritance问题?

我知道C#不支持多重inheritance,而且解决方案是使用接口。 但我不明白的是为什么接口不像多inheritance那样创建钻石问题。 如何使用接口避免多重inheritance的陷阱?

一个类可以实现任意数量的接口,即使这些接口也扩展其他接口。 只有才能进行多重inheritance

// This is not allowed class A { void A() {} } class B { void B() {} } class C : A, B {} // This is allowed interface IA { void A(); } interface IB { void B(); } class A : IA, IB { public void A() {} public void B() {} } 

类存在菱形问题,因为存在冲突实现的可能性(如果AB具有相同的方法并且C扩展两者,它采用哪种方法?)。 另一方面,接口只需要一个实现类型来获得它们声明的方法。

如果在两个接口中定义完全相同的方法,并且类实现两个接口,则无关紧要。 所有类需要做的是为方法提供一个实现,以便可以编写代码来调用该方法。 意思是,这有效:

 interface IA { void Method(int x); } interface IB { void Method(int x); } class A : IA, IB { public void Method(int x) { Console.WriteLine(x); } } 

请注意,一个类仍然可以从另一个类inheritance, 加上任意数量的接口:

 class A : B, IA, IB {} 

仅使用接口时不存在“菱形问题”,因为没有可能的模糊实现。 阅读维基百科文章 ,其中包含完整说明。

多个接口不会产生钻石问题,因为每个类必须提供自己独特的实现,这意味着不存在资源共享。

C#不允许多重inheritance,因为它们关心你,并使语言尽可能地自我调整。

您一次只能inheritance一个类和无限数量的接口

我认为仅在C#范围内考虑这一点是不公平的。

CLR本身不支持多重inheritance。 可能是因为他们想支持目前不支持它的其他语言,或者将来不支持它。

如果询问inheritance:class只能inheritance一个类,但可以实现任意数量的接口。 请参阅有关C#中的inheritance和多态的文章。

这是尝试实现通常可以通过多重inheritance实现的function的一种可能方式。

 interface IA { void DoAnything(string name); } class A : IA { public void DoSomething() { // some code } public void DoAnything(string name) { // Some code } } class B : IA { public void DoNothing() { // Some code } public void DoAnything(string name) { // Some code } } class StorageCache : IA { private A ObjA; private B ObjB; public void DoAnything(string name) { ObjA.DoAnything(name); ObjB.DoAnything(name); } public void DoNothing() { ObjB.DoNothing(); } public void DoSomething() { ObjA.DoSomething(); } }