面向可复用性的基本概念
可复用性的三个层面
- 代码层面的复用
- 模块层面的复用
在class与interface层面的复用
复用技术:继承与委托
继承:子类型继承、重写父类型的方法,类型耦合性高
委托:一个对象依赖另一个对象的方法,耦合性底 - 库层面的复用
开发者的程序 调用 可复用的类库
Framework框架 调用 开发者的代码
关于Framework
白盒框架:通过代码层面的继承进行框架扩展
黑盒框架:通过实现特定接口/委托进行框架扩展
LSP替换原则
子类型多态的表现,为静态检查
- 更强的不变量
- 更弱的前置条件
- 更强的后置条件
子类型方法的参数遵循逆变
子类型的返回值遵循协变 - 数组的lsp替换原则
协变
对于T[ ]的数组可保存T及其子类型的数据
5.泛型的lsp替换原则
不支持协变
原因:类型擦除,类型参数编译后丢弃,运行时无法使用
例:
List< T > = new ArrayList< T >—正确
List< Object > = new ArrayList< T >—错误
实现方法: - 使用通配符
List< ? >:无限定通配符
List< ? super A>:下限通配符
List<? extends A>:上限通配符 - 委托
显式委托:将委托对象的类型参数传入
隐式委托:委托对象作为内部变量隐藏
以排序为例: