一般来说,很难严格维护两个不同的具体对象之间的契约。
当我们处理泛型行为时,继承变得非常容易和健壮。
想象一下,我们要创建一个名为的类Ferrari
和一个名为 的子类SuperFerrari
。合同是:turnTheKey()
, goFast()
,skid()
乍一看,听起来很相似,没有冲突。让我们继承这两个具体的类。
但是,现在我们要向SuperFerrari
:中添加一个功能turnOnBluRayDisc()
。
问题:继承需要组件之间的 IS-A 关系。有了这个新特性,SuperFerrari
就不再是简单的Ferrari
有了自己的行为;它现在添加行为。这将导致一些丑陋的代码,需要一些强制转换,以便在最初处理Ferrari
引用时选择新功能(多态性)。
使用两个类共有的抽象/接口类,这个问题将消失,Ferrari
并且SuperFerrari
将是两个叶子,并且从现在开始它更具逻辑性Ferrari
,SuperFerrari
不应被视为相似(不再是 IS-A 关系)。
简而言之,从具体类派生在许多情况下会导致代码差/丑陋,灵活性较差,并且难以阅读和维护。
制作由抽象类/接口驱动的层次结构允许具体的子类单独发展而不会出现任何问题,特别是当您实现一些专用于特定数量的具体类的子层次结构而不会厌烦其他叶子,并且仍然受益于多态性时。