- 源代码级别的复用
- 模块级别的复用:类/抽象类/接口
- 库级别的复用:API/包
- 系统级别的复用:框架
继承 VS. 委托
面向复用的软件构造技术(construction of reuse)
subtyping:B是A的子类型=任何⼀个B都是A
① ⾏为子类型
子类型多态:客户端可⽤统一⽅式处理不同类型的对象
②Liskov替换原则
③例:正⽅形是特殊的⻓⽅形,正⽅形是否是⻓⽅型子类?
post-condition出现冲突
B要继承A,必满足:
④协变Covariance
⑤反协变、逆变)(java不支持,认为其为overload)
接收参数的范围变广
⑥泛型中的Liskov置换原则
如何让类型的司的两泛型产⽣联系:通配符(wildcard)?
-
list.size()等不依赖类型的操作
-
object方法(所有类型共享)
⑦委托(delegation):一个对象请求另一个对象的功能
隐式委派(少) /显式委派(直接调⽤)
(3)何时⽤继承何时⽤委托 ?例 Graph和 FriendshipGraph
如果⼦类只需复⽤父类中的⼀部分⽅法 ,通过委托调⽤部分⽅法,避免⽆⽤⽅法(4)组合优于继承原则
delegation在对象object层⾯,⽽继承发⽣在class层面
委托的种类:
- dependency 依赖 :临时性的委托 ,通过参数将对象法传入
- Association 关联 :永久性的委托 ,直接new ⼀个属性
- Composition 组合 :更强的委托,直接在该类中实例化个其他类
- Aggregation 聚集 :更弱的委托 ,建⽴上述联系后可传⼊参数改变
⑧ API :程序员为主导
Framework :框架为主导
白盒框架:模板模式
黑盒框架:策略/观察者模式