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

时间:2011-03-02 07:27:00

标签: c# oop inheritance interface multiple-inheritance

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

7 个答案:

答案 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() {}
}

类存在菱形问题,因为存在冲突实现的可能性(如果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);
    }
}

请注意,某个类仍可继承其他类 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();
    }
}