Software Construction Note 5.2
一、类的复用
1. 多态、子类型和重载
a.三种多态:
(多态:用一个符号表示多个不同的类型-类似接口)
重载:方法的多个同名实现(方法签名不同)
泛型:一个类型名字代表多(数据)类型
子类型:一个变量名代表多个类的实例
b. 即时多态和重载:
c. 参数多态和泛型
d. 子类型多态
e. 行为子类型和LSP
LSP/里氏替换原理
注意:子类必须调用父类的一个(且只能调用一个)构造方法,只能用一次super,在构造方法内的第一行。
关于型变:协变、逆变、不变
方法重写中可能存在的型变(潜在问题):返回类型,参数类型
泛型不型变(但如果有通配符”?”情况就不同了)
程序运行时回进行泛型的类型擦除/替换。
2. 参数多态和泛型
3. 组合和委托
例如:interface Comparator和(boolean)compare方法
委托:对象间功能依赖(有利于复用),实体间共享代码/数据,依赖动态绑定。
聚合是组合的一种
对象间的5种关系:委托(关联,依赖, 组合,聚合),继承。
耦合程度:继承>组合>聚合>关联>依赖
二、 系统级库和框架的复用
1. API和库
注意区分库和框架!
但两者目的都是定义关键抽象、对象不变量和方法、控制流(都包含API)。
2. API的设计
特征:
模块化,能够独立地被test(被observe);
一旦发布难以修改;
功能单一,分解/合并容易,能完成功能上尽可能小。
原则:
注意信息的保护(尽量不要return一个mutable类);
尽量使用委托和组合(少用继承,因为违背了封装原则);
对所有可访问数据提供String形式的访问方法,避免客户端去解析;
返回值勿需进行异常处理, e.g., 用空集合或者0长度数组, 不要用null。
3. 框架
又分为白盒框架(通过继承使用)和黑盒框架(通过实现接口使用) p82
现成框架有的能自己运行(Eclipse)有的需要be extended(Junit, Swing)
Collections框架:
常用:
iterator接口
set接口:元素不重复,强制equals和hashcode计算??-hashset
list接口:可重复,可通过下标访问-arraylist, linkedlist
map接口:hashmap
含两种包装器
兼容性:向上兼容/向前兼容,向下兼容/向后兼容。