【发布时间】:2018-03-10 11:59:13
【问题描述】:
在学习接口时,我发现它们可用于实现多接口继承,而多类继承在 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 类。但是为了继承 Class 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();
}
}
}
现在,如果我们可以在没有接口的情况下编写它,为什么我们首先要使用接口?
这是否意味着可以在不使用接口的情况下完成多重继承?
或者即使使用接口也无法进行多重继承?
【问题讨论】:
-
您提出的替代方案不是一回事。 C 本身不再实现任何其他类型。它包含其他类型的属性。那你到底在问什么?当您个人不想使用接口时,为什么还要存在接口?您编写了一个没有任何意义的人为示例,并将其替换为另一个没有任何意义的人为示例。但这并没有展示任何关于接口的内容。如果你问为什么存在接口,我想有很多关于这个主题的文章。
-
如果你想在类
C中使用方法PrintB而没有B bObject = new B();怎么办? -
@David 如果我的例子错了,你能给我一个多接口继承的简单例子吗?
-
这就像一盘国际象棋。你可以通过阅读来了解这些棋子是如何移动的,但除非你练习,否则你真的不明白如何使用它们。这不是一个可以以问答形式回答的问题。但了解接口有用性的一种方法是阅读本书Dependency Injection in .NET。当然,这只是使用接口的一种方式,在 DI 出现之前它们就已经很有用了。
-
@Learner:
"But I would have to implement both interfaces."是的,这正是我们正在谈论的。多个接口。"Then why would I inherit from Interfaces?"所以你的对象可以是这些类型。你似乎遗漏了一些关于静态类型的东西。仅仅因为您编写的类有一个名为CompareTo()的方法并不意味着它是IComparable的一个实例。您不能在需要IComparable而不实现接口的任何上下文中使用它。编译器并不十分关心方法的名称,它关心的是对象的类型。
标签: c# .net multiple-inheritance