我知道C#不支持多重继承,而且解决方案是使用接口。但我不明白的是为什么接口不像多继承那样创建钻石问题。如何使用接口避免多重继承的陷阱?
答案 0 :(得分:23)
一个类可以实现任意数量的接口,即使这些接口也扩展了其他接口。只有类才能实现多个继承。
// 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() {}
}
类存在菱形问题,因为存在冲突实现的可能性(如果A
和B
具有相同的方法并且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);
}
}
请注意,某个类仍可继承其他类 plus 任意数量的接口:
class A : B, IA, IB {}
答案 1 :(得分:4)
仅使用接口时不存在“菱形问题”,因为没有可能的模糊实现。阅读Wikipedia article,其中包含完整说明。
答案 2 :(得分:2)
多个接口不会产生菱形问题,因为每个类必须提供自己的唯一实现,这意味着不会共享资源。
C#不允许多重继承,因为它们关心你,并且使语言成为尽可能自我调整的语言。
答案 3 :(得分:1)
您一次只能继承一个类和无限数量的接口
答案 4 :(得分:1)
我认为仅在C#
的范围内考虑这一点是不公平的。
CLR
本身不支持多重继承。可能是因为他们想支持目前不支持它的其他语言,或者将来不支持它。
答案 5 :(得分:0)
如果询问继承:class只能继承一个类,但可以实现任意数量的接口。请参阅有关C#中继承和多态的this文章。
答案 6 :(得分:0)
这是一种尝试实现通常可以通过多重继承实现的功能的方法。
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();
}
}