【问题标题】:Why is multiple inheritance not the main purpose of interfaces? [closed]为什么多重继承不是接口的主要目的? [关闭]
【发布时间】:2017-11-01 11:27:05
【问题描述】:

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

这是为什么呢?那他们是为了什么?还没有人能简单地向我解释这件事,我很困惑。

我阅读了一些描述接口的文章和书籍,似乎所有人都建议使用接口作为实现多重继承的解决方法..

【问题讨论】:

  • 继承通常会让你更富有。接口只会让你变得更穷,它们会让你更加努力地实现它们。
  • 鉴于接口不包含实现,它们肯定不能用于给您继承 - 没有什么可继承的。只有您需要在声称实现给定接口的类中实际实现的合同。这就是为什么我们首先使用这两个词——“继承”与“实现”。
  • 接口允许你在一个对象上执行一个契约。该对象将具有至少接口“功能”,允许您对其执行某种操作。对象不一定必须满足“是”条件,这通常是继承所要求的。一个对象可以实现任意数量的接口。
  • 冒着听起来很愚蠢的风险,你为什么不问问你的老师他们说你不明白的事情呢?我认识的大多数老师都不会因为“没有得到它”而对你不屑一顾,而是很乐意从好奇的学生那里得到问题,让他们进一步解释事情。
  • 别这样。没有得到它是学生的全部工作,这就是为什么你是学生。除了没有努力去理解之外,永远不要因为任何原因不理解某事而感到羞耻。如果您害怕浪费其他课程的时间,或者您的老师显然没有更多时间,请尝试获得私人听众,或发送邮件。当然,询问 Stack Overflow 也没有错,但没有什么能比得上一位可用的老师。

标签: c# oop inheritance interface multiple-inheritance


【解决方案1】:

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

何必呢?定义契约是额外的工作,为什么不直接创建一个类呢?

例如,假设您要开发一个绘图应用程序。您可能会想出几个对象,如 Circle、Triangle、Square 等。然后您开始添加方法并添加类似 Draw() 的东西。这是您可以添加到所有形状实现的界面的东西。在 C# 中,按照惯例,它会被命名为 IDrawable

但为什么不上课呢?

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

但为什么不上课呢?

因为可能会有更多功能,例如Move()Serialize() 等,而 C# 不允许您从多个类继承。

为什么不呢?

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

【讨论】:

    【解决方案2】:

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

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

    是的,有些人试图用多个接口模拟多重继承,但这不是它的目的,而且这种模拟无论如何都非常糟糕。

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

    【讨论】:

    • 我的老师刚刚说了第一段。现在对我来说似乎更合乎逻辑。谢谢@Erik!
    猜你喜欢
    • 2012-01-21
    • 1970-01-01
    • 2011-06-21
    • 2017-03-27
    • 2013-08-05
    • 2011-01-19
    • 2017-03-24
    相关资源
    最近更新 更多