仅当下列的所有标准被满足时,方可使用继承:
n 子类表达了“是一个…的特殊类型”,而非“是一个由…所扮演的角色”。
n 子类的一个实例永远不需要转化(transmute)为其它类的一个对象。
n 子类是对其父类的职责(responsibility)进行扩展,而非重写或废除(nullify)。
n 子类没有对那些仅作为一个工具类(utility class)的功能进行扩展。
n 对于一个位于实际的问题域(Problem Domain)的类而言,其子类特指一种角色(role),交易(transaction)或设备(device)。
n “是一个…的特殊类型”,而非“是一个由…所扮演的角色”
F 失败。乘客是人所扮演的一种角色。代理人亦然。
n 永远不需要转化
F 失败。随着时间的发展,一个Person的子类实例可能会从Passenger转变成Agent,再到Agent Passenger。
n 扩展,而非重写和废除
F 通过。
n 不要扩展一个工具类
F 通过。
n 在问题域内,特指一种角色,交易或设备
F 失败。Person不是一种角色,交易或设备。
继承并非适用于此处!
使用组合进行挽救!
n “是一个…的特殊类型”,而非“是一个由…所扮演的角色”
F 通过。乘客和代理人都是特殊类型的人所扮演的角色。
n 永远不需要转化
F 通过。一个Passenger对象将保持不变;Agent对象亦然。
n 扩展,而非重写和废除