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

Hit*_*ati 12 c# oop inheritance interface multiple-inheritance

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

Bol*_*ock 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() {}
}
Run Code Online (Sandbox Code Playgroud)

钻石问题存在于类中,因为存在冲突实现的可能性(如果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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

class A : B, IA, IB {}
Run Code Online (Sandbox Code Playgroud)

  • 你是怎么弄清楚他在问什么的?:) (6认同)
  • @tbridge:这只是一个疯狂的猜测. (4认同)
  • downvote不是来自我,但我能理解.你的答案并没有真正触及钻石问题,这与名称巧合的方法毫无关系.最好显示两个实现公共IBase的接口,以及一个实现两个接口的类.接口不存在菱形问题的原因是,如果一个类MyThing实现了IList <T>和ICollection <T>,它们都继承了IEnumerable <T>,那么该类只实现IEnumerable <T>一次.是否直接转换为IEnumerable <T> ... (4认同)
  • 您还可以显式实现这些方法.这允许您为不同接口的方法提供不同的实现.通过接口访问,将始终调用正确的方法. (3认同)
  • 当您尝试使用通用方法实现两个接口时,会出现与钻石问题类似的问题 - 方法名称在每个接口的上下文中可能表示不同的内容. (2认同)