分类:
2012-10-21 18:06:27
原文地址:理解面向对象设计4(建立面向对象模型之继承和组合) 作者:qingfenghao
继承和组合是两种常见的代码重用方式。组合是通过对现有的对象进行拼装集成产生新的、更复杂的功能。因为在对象之间,各自的内部细节是不可见的,所以我们也说这种方式的代码复用是“黑盒式代码复用”。从代码重用的角度来看,父类的大部分内部细节对于子类是可见的。所以我们通常也可以说通过继承的代码复用是一种“白盒式代码复用”。
事实上,继承和组合都是在新类型中潜入已存在的类型的子对象(继承隐式嵌入了父类对象)。然而,当我们想重用原类型作为新类型的内部实现的话(原类型对使用者不可见),最好使用组合;如果我们不仅想重用原类型的内部实现,还想重用原来接口的话那就使用继承(原类型对使用者可见),它还能向上映射到这个父类,这一点对多态性很重要。
除此之外,根据Coad规则,仅当下列的所有标准被满足时,方可使用继承:
a.子类表达了“是一个…的特殊类型”,而非“是一个由…所扮演的角色”。
b.子类的一个实例永远不需要转化(transmute)为其它类的一个对象。
c.子类是对其父类的职责(responsibility)进行扩展,而非重写或废除(nullify)。
d.子类没有对那些仅作为一个工具类(utility class)的功能进行扩展。
e.对于一个位于实际的问题域(Problem Domain)的类而言,其子类特指一种角色(role),
交易(transaction)或设备(device)。
一个常见的例子是Person、Agent和Passenger的例子。虽然Agent和Passenger都属于Person,但它们其实只是Person的一种角色,而且可能会相互转化甚至并存,所以不适合于继承。可以用下列两种方式实现: