软件构造 课堂笔记 :面向复用的软件构造方法(2)

面向复用的软件构造技术:

一.可复用的类

(1)行为子类型与Liskov替换原则
(2)重写与重载
(3)参数多态与泛型编程
(4)组合与委托
1.行为子类型与liskov替换原则
行为子类型:
子类型多态: 客户端用统一的方式处理不同类型的对象
软件构造 课堂笔记 :面向复用的软件构造方法(2)
Java会确保一下的原则:
1.子类型可以增加方法,但不可删
2.子类型需要实现抽象类型中的所有未实现方法
3.子类型中重写的方法必须有相同或子类型的返回值或者符合co-variance的参数
4. 子类型中重写的方法必须使用同样类型的参数或者符合contra-variance的参数
5. 子类型中重写的方法不能抛出额外的异常
对于spec,有:
1.更强的不变量
2.更弱的前置条件
3.更强的后置条件
(contra-variance)子类型的方法参数:逆变
(co-variance)子类型的方法的返回值:协变
协变: 父类->子类越来越具体,返回值类型不变或更加具体
反协变:父类->子类越来越具体,参数类型不变或者更抽象

类的复用样例1软件构造 课堂笔记 :面向复用的软件构造方法(2)
入上图样例,Car继承了抽象类vehicle, 并重写函数brake.其中两个不变量条件未变,并且扩展了自己的变量。前置条件和后置条件未变。

类的复用样例2
软件构造 课堂笔记 :面向复用的软件构造方法(2)
如上图所示,Hybrid类继承了Vehicle类,其中start()方法的前置条件变弱,后置条件不变
而brake方法的重写前置条件不变,后置条件增强,符合标准

类的复用样例3软件构造 课堂笔记 :面向复用的软件构造方法(2)
如上图所示的样例中,square类继承了Rectangle类,其中 蓝色字迹部分的不变量被加强,也符合原则。

样例4软件构造 课堂笔记 :面向复用的软件构造方法(2)
重写的setWidth 的前置条件不变,后置条件变强了 ,符合标准。

2.里氏替换原则:(LSP)Strong behavoiral subtyping 强行为子类型化
前置条件不能强化
后置条件不能弱化
不变量要保持
子类型方法参数:逆变
子类型方法返回值:协变
协变: 父类型 ->子类型 越来越具体 返回值和异常值的类型都不变或者变得更加具体
实例:软件构造 课堂笔记 :面向复用的软件构造方法(2)
子类型比父类型的返回值更加具体了。

逆变/反协变:
父类型->子类型:越来越具体specific 参数类型:要相反的变化,要不变或越来越抽象
软件构造 课堂笔记 :面向复用的软件构造方法(2)
未完成 TO BE CONTINUED