面向可复用性的基本概念

可复用性的三个层面

  1. 代码层面的复用
  2. 模块层面的复用
    在class与interface层面的复用
    复用技术:继承与委托
    继承:子类型继承、重写父类型的方法,类型耦合性高
    委托:一个对象依赖另一个对象的方法,耦合性底
  3. 库层面的复用
    开发者的程序 调用 可复用的类库
    Framework框架 调用 开发者的代码

关于Framework
白盒框架:通过代码层面的继承进行框架扩展
黑盒框架:通过实现特定接口/委托进行框架扩展

LSP替换原则

子类型多态的表现,为静态检查

  1. 更强的不变量
  2. 更弱的前置条件
  3. 更强的后置条件
    子类型方法的参数遵循逆变
    子类型的返回值遵循协变
  4. 数组的lsp替换原则
    协变
    对于T[ ]的数组可保存T及其子类型的数据
    5.泛型的lsp替换原则
    不支持协变
    原因:类型擦除,类型参数编译后丢弃,运行时无法使用
    例:
    List< T > = new ArrayList< T >—正确
    List< Object > = new ArrayList< T >—错误
    实现方法:
  5. 使用通配符
    List< ? >:无限定通配符
    List< ? super A>:下限通配符
    List<? extends A>:上限通配符
  6. 委托
    显式委托:将委托对象的类型参数传入
    隐式委托:委托对象作为内部变量隐藏
    以排序为例:
    面向可复用性的基本概念