封装体继承用于实施泛化-专门化,来利用多态性、重用实施。这里的关键字是“实施” - 这是一个主要用于重用封装体的内部结构,而不是封装体的外部行为的方法。
继承经常误用于实现那些本来可以使用更简单的设计方法来更轻松实现的事物。
将继承用于泛化-专门化
继承有三种类型。将它们从复杂性最低(最尽人意)到最高(最不尽人意)排列,分别是:
-
接口继承 - 只继承端口和协议,这是最理想的继承类型
-
结构继承 - 继承接口加上结构容器分层结构(对框架有用)
-
行为继承 - 除了接口和结构继承外,还复用行为代码和状态机
结构和行为继承会带来一些问题:
-
对超类作出更改时,继承提供的非常强烈的耦合程度造成对子类的级联的更改。
-
覆盖和删除子类中的超类行为和结构的需要表示没有对继承进行正确使用(通常用于策略性的代码重用)。重构类和封装体以及委托的适当使用是更适当的策略。
-
继承意味着将设计决策沿着类层次结构向上移动,造成不尽人意的设计和编译依赖关系。
其他问题包括:
-
决策可能并非在所有的使用情形中都适当。
-
引入继承实际上使重用更困难,因为设计元素会耦合得更紧密。
-
设计变得更脆弱,因为使决策无效的任何新要求都会造成大问题。
-
设计必须极端灵活才能补偿,而要做到这一点往往很困难。这就是使设计可重用框架如此困难的原因!
所有包含结构/行为的设计都有内在的决策和假设(明确或隐含)。要问的关键问题是:您完全确信,决策/假设将总是有效吗?如果不是的话,您可以做什么来除去它或者使它有更改的可能?
|