当我学习接口时,我发现它们可用于实现多接口继承,并且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();
}
}
}
现在,为什么我们首先使用接口,如果我们可以在没有接口的情况下编写它?
这是否意味着可以在不使用接口的情况下完成多重继承?
即使使用接口也无法进行多重继承?
答案 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 ++并且不得不发明一些微不足道的替代品。但从长远来看,这样做会稍微好一些。