1、Barbara Liskov简介
Barbara Liskov (1939- ),美国第一位计算机科学方向的女博士,2008年图灵奖获得者。
她提出了第一个支持数据抽象的面向对象编程语言CLU,对现代主流语言如C++/Java/Python /Ruby/C#都有深远的影响。她所提炼出来的数据抽象思想,成为软件工程的重要精髓之一。
她提出的“Liskov替换原则”,是面向对象最重要的几大原则(SOLID)之一。
2、Behavioral subtyping
Java中编译器依据强制的规则进行静态类型检查。
(1)子类型可以增加方法,但是不能删去方法;
(2)子类型需要实现抽象类型(接口、抽象类)所有未实现的方法;
(3)子类型中重写的方法必须拥有相同的或子类型的返回值,或者符合co-variant的参数;
(4)子类中重写的方法必须使用同样类型的参数或者符合contra-variant的参数(此种情况Java目前按照重载overload处理);
(5)子类型中重写的方法不能抛出额外的异常;
同样也适用于指定的行为(方法):
(1)更强的不变量;
(2)更弱的前置条件;
(3)更强的后置条件;
3、Liskov Substitution Principle(LSP)
LSP是一种特殊的子类型关系的定义,称为(强)行为子类型。
在编程语言中,LSP依赖于以下限制:
(1)前置条件不能强化;
(2)后置条件不能弱化;
(3)不变量要保持;
(4)子类型方法参数:逆变(指从父类型到子类型越来越具体,参数类型要相反地变化,即不变或者越来越抽象);
(5)子类型方法的返回值:协变(指从父类型到子类型越来越具体,返回值类型要相同地变化,即不变或越变越具体);
(6)异常类型:协变(指从父类型到子类型越来越具体,异常的类型要相同地变化,即不变或越变越具体)。