确实可以使用接口来实现多重继承
本文关键字:实现 多重继承 接口 可以使 | 更新日期: 2023-09-27 18:10:28
我有这个困惑很长一段时间。很多人说我们可以在c#或Java等语言中通过接口实现多重继承,这些语言不像c++那样支持多重继承。但是我对继承和接口的理解是否定的。因为接口是用来验证与行为无关的实现的契约。接口定义了什么东西可以做(而不是什么东西是什么)。但继承是继承父母的行为和/或财产(就像一个孩子从他的父母那里得到了一些遗传行为——这是继承)。现在孩子正在学习一种技能,比如绘画和烹饪,接口(证书或合同)作为孩子拥有这种技能的证明(这是孩子能做的事情,而不是从父母那里得到的——这不是继承)
我理解错了吗?如果不是,那么为什么说我们可以使用接口实现多重继承呢?
接口提供了类型的多重继承,而不是行为。实现List
和Map
的类是"ListMap",但实现与任何现有的List
或Map
实现(不一定)无关。
当然,使用组合(无论如何应该受到青睐),您可以轻松地创建一个ListMap
,它将调用相应地委托给它的list
和map
属性,同时提供一些可能有用的函数来组合它们各自的数据。
Java 8接口允许默认方法,因此行为继承现在也是可能的。
在Java中你可以创建一个接口,例如Animal
和一个抽象类Bird
。
那么你可以有一个类MockingBird
,它扩展了Bird
的行为并实现了Animal
的动作。
但是,您可以将MockingBird
定位为Animal
或Bird
,因为它从两者"继承"
不允许使用接口实现多重继承
在Java中完全没有,在c#中,我们可以更接近。
当我想实现一个观察者时,我研究了这个问题,并最终在Robert Martin的博客中结束:http://blog.cleancoder.com/uncle-bob/2015/01/08/InterfaceConsideredHarmful.html
读完这篇文章后,我意识到他在谈论Java,但是c#支持扩展方法,允许你在接口上附加行为,所以我试图在一些IObservable接口上实现我的实现,但显然失败了,即使我可以在这样的接口扩展方法中附加行为,我仍然不允许在它们上附加状态。如果有一天微软决定实现扩展属性,那么这种组合(接口+扩展方法+扩展属性)可能足以真正模拟一些有用的多重继承。
现在,我们只能在所有的观察者中复制代码或委托代码,如博客中所述。