c# - 使用接口(interface)如何克服C#中的多重继承问题?

标签 c# oop inheritance interface multiple-inheritance

我知道 C# 不支持多重继承,解决方案是使用接口(interface)代替。但我不明白的是,为什么接口(interface)不会像多重继承那样产生菱形问题。使用接口(interface)如何避免多重继承的陷阱?

最佳答案

一个类可以实现任意数量的接口(interface),即使这些接口(interface)也扩展了其他接口(interface)。多重继承仅对是不可能的。

// 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)只需要一个实现类型来拥有它们声明的方法。

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

interface IA { void Method(int x); }
interface IB { void Method(int x); }

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

请注意,一个类仍然可以继承自另一个类,加上任意数量的接口(interface):

class A : B, IA, IB {}

关于c# - 使用接口(interface)如何克服C#中的多重继承问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5164582/

相关文章:

Java类继承和子类对象比较

C#:非标志枚举,有没有更简单的方法来检查枚举以匹配多个值之一?

c# - 为什么这个位图图像在我加载后改变了它的大小?

C#:分页,Math.Ceiling

通过 super() 调用进行 Javascript 继承

c++模板-类型/值不匹配-使用依赖于派生类的类型实例化基类模板

c# - 未能发布 Windows 窗体项目

oop - 单一责任原则: class level or method level

javascript - 创建扩展 native 数组的集合有哪些危险?

php - mysql不存储blob列数据