我们真的需要在c#中进行多重继承的接口吗?

时间:2018-03-10 11:59:14

标签: c# .net multiple-inheritance

当我学习接口时,我发现它们可用于实现多接口继承,并且C#中无法实现多类继承。所以,我发现以下代码实现了多个接口继承。

using System;

namespace Test
{
    interface IB
    {
        void PrintB();
    }

    class A
    {
        public void PrintA()
        {
            Console.WriteLine("PrintA() Method.");
        }
    }

    class B : IB
    {
        public void PrintB()
        {
            Console.WriteLine("PrintB() Method.");
        }
    }

    class C : A, IB
    {
        B bObject = new B();

        public void PrintB()
        {
            bObject.PrintB();
        }
    }

    class Program
    {
        public static void Main()
        {
            C cObject = new C();
            cObject.PrintA();
            cObject.PrintB();
        }
    }
}

但是在这段代码中我们直接继承了A类。但是对于继承B类方法,我们使用的是接口IB。

现在,我无法看到这样做的好处。我们可以在不使用这样的接口IB的情况下编写此代码。

using System;

namespace Test
{
    class A
    {
        public void PrintA()
        {
            Console.WriteLine("PrintA() Method.");
        }
    }

    class B
    {
        public void PrintB()
        {
            Console.WriteLine("PrintB() Method.");
        }
    }

    class C : A
    {
        B bObject = new B();

        public void PrintB()
        {
            bObject.PrintB();
        }
    }

    class Program
    {
        public static void Main()
        {
            C cObject = new C();
            cObject.PrintA();
            cObject.PrintB();
        }
    }
}

现在,为什么我们首先使用接口,如果我们可以在没有接口的情况下编写它?

这是否意味着可以在不使用接口的情况下完成多重继承?

即使使用接口也无法进行多重继承?

2 个答案:

答案 0 :(得分:0)

您错过了关于虚拟方法的观点。我们希望能够做到这一点:

interface IPrint
{
    void Print();
}

class A : IPrint
{
    public void Print()
    {
    }
}

class B : IPrint
{
    public void Print()
    {
    }
}
...
foreach (IPrint p in printables)
{
    p.Print();
}

您的方法无法做到这一点,因为C类中的PrintB只是一种方法。继承不是关于具有相同名称的方法,而是关于定义对它们所针对的类的实例执行操作的动词。

答案 1 :(得分:0)

多重继承导致Diamond Problem。那个钻石是程序员最大的敌人。

因此,.NET或CLI的设计者(我永远不会记得它们)决定他们不会处理这个问题,并强制要求单一继承"。这是解决这个问题的常见策略之一"死亡之钻"。

由于只允许单个继承意味着某些东西会丢失,所以它们实现了接口来抵消它。这是.NET中比较严格的许多方法之一,然后说Native C ++并且不得不发明一些微不足道的替代品。但从长远来看,这样做会稍微好一些。

相关问题