确实可以使用接口来实现多重继承

本文关键字:实现 多重继承 接口 可以使 | 更新日期: 2023-09-27 18:10:28

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

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

确实可以使用接口来实现多重继承

接口提供了类型的多重继承,而不是行为。实现ListMap的类是"ListMap",但实现与任何现有的ListMap实现(不一定)无关。

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

Java 8接口允许默认方法,因此行为继承现在也是可能的。

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

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

但是,您可以将MockingBird定位为AnimalBird,因为它从两者"继承"

不允许使用接口实现多重继承

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

当我想实现一个观察者时,我研究了这个问题,并最终在Robert Martin的博客中结束:http://blog.cleancoder.com/uncle-bob/2015/01/08/InterfaceConsideredHarmful.html

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

现在,我们只能在所有的观察者中复制代码或委托代码,如博客中所述。