2017-05-31 89 views
-1

我的老师一直在说接口不存在,所以可以使用它们作为在c#中实现多重继承的一种方式。为什么多重继承不是接口的主要目的?

这是为什么?那他们到底是什么?没有人可以很容易地向我解释这一点,但我很困惑。

,我读了描述接口几篇文章和书籍,似乎所有的人都建议使用接口作为一种变通方法来实现多重继承..

+1

继承通常会让你更富有。界面只会让你变得更穷,它们会让你更加努力地去实现它们。 –

+2

鉴于接口不包含任何实现,它们肯定不能用于给你*继承* - 没有什么可以继承。只有您需要在声称实现给定接口的类中实际实现的合约。这就是为什么我们首先使用这两个词 - “继承”与“实现”。 – Luaan

+2

接口允许您在对象上执行合同。该对象将至少具有**接口“功能”,允许您对其执行某种操作。该对象不一定必须满足“是”的条件,这通常是继承所要求的。一个对象可以实现尽可能多的接口。 –

回答

1

在静态类型语言,或者在使用静态类型在使用动态和静态类型(如C#)的语言中,继承由两部分组成。界面和实现。界面是一个合同,表示它将满足一组特定的方法或属性。实现是实际执行的代码。代码实现了的一个接口。

接口用于保证对象实现特定的合同。这可以是单个合同,也可以是多个合同。这不是多继承,它继承了接口和实现。

是的,有些人试图用多个接口来模拟多重继承,但这不是它的目的,而且仿真非常差。

多个接口说对象支持多个合同。多重继承说一个对象重用多个实现。同样,继承需要接口和实现。接口实现只是接口。

+0

我的老师刚才说了第一段。现在看来对我来说更合乎逻辑了。谢谢@Erik! – RoloffM

1

接口形成一个契约(他们说对象可以做什么),但不提供实现。

为什么要麻烦?定义合同是额外的工作,为什么不创建一个班级?

例如,假设您想开发一个绘图应用程序。你可能会想出几个对象,如圆形,三角形,方形等,然后你开始添加方法并添加诸如Draw()之类的东西。这是你可以添加到所有形状实现的接口。在C#中,按照惯例,它将被命名为IDrawable

但为什么不上课?

让我们假设您正在扩展应用程序并添加对形状分组的支持,以创建更复杂的模式。这些组也可以绘制,所以它们也有Draw()方法。现在,如果你只想画出“东西”,你不需要知道它是一个形状还是一个组,或者你还没有发明的其他东西。

但为什么不上课?

由于可能有更多的功能,如Move()Serialize()等,并且C#不允许您从多个类继承。

为什么不呢?

这不是一个技术限制,而是C#语言设计者做出的选择。一些语言,如C++允许它,但它带来很少的技术问题,最着名的是diamond problem。它也使得编译器更加复杂,并且已经决定it is not worth it。它也