【问题标题】:Does really interfaces can be use to achieve multiple inheritance接口真的可以用来实现多重继承吗
【发布时间】:2015-11-24 14:15:13
【问题描述】:

我有这种困惑很长时间了。许多人说我们可以通过 C# 或 Java 等语言中的接口来实现多重继承,这些语言不像 C++ 那样支持它。但是我对继承和接口的理解说不。因为接口是验证与行为无关的实现的合同。接口定义了某物可以做什么(而不是某物是什么)。但是继承是从父母那里继承行为和/或财产(就像孩子从父母那里获得一些遗传行为 - 这就是继承)。现在孩子正在学习一种技能,比如绘画和烹饪,而界面(证书或合同)作为对孩子拥有这些技能的验证(这是孩子除了从父母那里得到的东西之外还能做的事情——这就是不是继承)

所以我理解错了吗?如果不是,那为什么说我们可以使用接口实现多重继承?

【问题讨论】:

标签: java c# inheritance interface multiple-inheritance


【解决方案1】:

接口给你一个类型的多重继承,但不是行为。实现ListMap 的类是“ListMap”,但实现与任何现有的ListMap 实现无关(必然)。

当然使用组合(无论如何都应该受到青睐),您可以轻松地创建一个 ListMap,它将调用相应地委托给它的 listmap 属性,同时提供一些可能有用的函数来组合它们各自数据。

Java 8 接口允许使用默认方法,因此现在也可以继承行为。

【讨论】:

    【解决方案2】:

    在 Java 中,您可以创建一个接口,例如 Animal 和一个抽象类 Bird

    那么你可以拥有一个类MockingBird,它扩展了Bird 的行为并实现了Animal 的动作。

    但是,您可以将MockingBird 称为AnimalBird,因为它“继承”两者。

    【讨论】:

      【解决方案3】:

      不行,接口不能用来实现多重继承

      在 Java 中完全没有,在 C# 中,我们可以更接近。

      我想实现一个观察者的时候研究了这个问题,结果在罗伯特马丁的博客:http://blog.cleancoder.com/uncle-bob/2015/01/08/InterfaceConsideredHarmful.html

      读完这篇文章后,我意识到他说的是 Java,但 C# 支持扩展方法,允许您在接口上附加行为,所以我尝试在某些 IObservable 接口上实现我的实现,但显然失败了,即使我可以在这样的情况下附加行为接口扩展方法我仍然不允许在它们上附加状态,如果有一天微软决定实现extension properties,那么这种组合(接口+扩展方法+扩展属性)可能足以真正模拟一些有用的多重继承。

      目前,我们被困在重复代码,或者在我们所有的观察者中复制代码,如博客中所述。

      【讨论】:

        猜你喜欢
        • 2011-04-29
        • 2011-11-21
        • 2011-10-07
        • 2015-12-23
        • 1970-01-01
        • 2013-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多