使用接口如何克服C#中的多重继承问题?
我知道C#不支持多重继承,解决方案是使用接口。但我不明白的是,为什么接口不会像多重继承那样产生菱形问题。使用接口如何避免多重继承的陷阱?一个类可以实现任意数量的接口,即使这些接口也扩展了其他接口。多重继承不可能仅用于类 类存在菱形问题,因为存在冲突实现的可能性(如果使用接口如何克服C#中的多重继承问题?,c#,oop,inheritance,interface,multiple-inheritance,C#,Oop,Inheritance,Interface,Multiple Inheritance,我知道C#不支持多重继承,解决方案是使用接口。但我不明白的是,为什么接口不会像多重继承那样产生菱形问题。使用接口如何避免多重继承的陷阱?一个类可以实现任意数量的接口,即使这些接口也扩展了其他接口。多重继承不可能仅用于类 类存在菱形问题,因为存在冲突实现的可能性(如果a和B使用相同的方法,而C同时扩展了这两种方法,则采用哪种方法?)。另一方面,接口只需要实现类型就可以拥有它们声明的方法 如果在两个接口中定义了完全相同的方法,并且一个类实现了这两个接口,那么这并不重要。该类需要做的就是为该方法提供一
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);
}
}
请注意,一个类仍然可以从另一个类继承,加上任何数量的接口:
class A : B, IA, IB {}
多个接口不会产生菱形问题,因为每个类都必须提供自己独特的实现,这意味着不存在资源共享
C#不允许多重继承,因为他们关心你,并使语言尽可能地自我保护。你一次只能继承一个类和无限数量的接口。钻石问题仅在使用接口时不存在,因为不可能有不明确的实现。阅读包含完整解释的。如果您询问继承:类只能继承一个类,但可以实现任意数量的接口。请参阅关于C#中的继承和多态性的文章。我认为仅在
C#
的范围内考虑这一点是不公平的
CLR
本身不支持多重继承。可能是因为他们想支持当前不支持或将来无法支持的其他语言。这是一种可能的方法,可以尝试实现通常可以通过多重继承实现的目标
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();
}
}
对不起,你的问题不清楚。你能更清楚地说明你的问题吗?你说的这个“MI”是什么?@RPM1984:可能是多重继承(不是标题中的多重接口)…解决方案是C提供接口-这不是多重继承,而是多重实现。关于c#多重继承的问题已经有很多,术语“继承”包括两个相互正交的概念:可扩展性和可替换性。接口提供后者而不提供前者;作文提供了前者(如果笨拙的话),但没有提供后者。你怎么知道他在问什么@特布里奇:这只是一个胡乱的猜测。否决票不是我投的,但我能理解。你的答案并没有真正触及钻石问题,钻石问题与名称恰好匹配的方法无关。最好显示两个实现公共IBase的接口,以及一个实现两个接口的类。接口不存在菱形问题的原因是,如果一个类MyThing实现了IList和ICollection(两者都继承了IEnumerable),那么该类只实现一次IEnumerable。无论它是否直接转换为IEnumerable…当您尝试使用公共方法实现两个接口时,会出现类似于菱形问题的问题-方法名称在每个接口的上下文中可能意味着不同的内容。您也可以显式实现这些方法。这允许您为不同接口的方法提供不同的实现。通过接口访问时,总是会调用正确的方法。尽管可能是这样的情况,值得记住,但我认为这并不能回答问题。相反,我会将此作为评论发布。@Cody Gray:他想知道为什么C#不支持它。这就是我的答案。“因为他们关心你”意味着其他语言“不关心”,这是毫无意义的:)
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();
}
}