Barbara Liskov (1939- )
MIT
http://www.pmg.csail.mit.edu/~liskov
美国第一位计算机科学方向的女博士
2008年图灵奖获得者
提出了第一个支持数据抽象的面向对象编程语
言CLU,对现代主流语言如C++/Java/Python
/Ruby/C#都有深远的影响。她所提炼出来的
数据抽象思想,成为软件工程的重要精髓之一。
她提出的“Liskov替换原则”,是面向对象最
重要的几大原则(SOLID)之一。
- LSP的含义
里氏替换原则(Liskov Substitution Principle, LSP)的定义和主要思想如下:由于面向对象编程技术中的继承在具体的编程中过于简单,在许多系统的设计和编程实现中,我们并没有认真地、理性地思考应用系统中各个类之间的继承关系是否合适,派生类是否能正确地对其基类中的某些方法进行重写等问题。因此经常出现滥用继承或者错误地进行了继承等现象,给系统的后期维护带来了不少麻烦。这就需要我们有一个设计原则来遵循,它就是替换原则。
LSP指出:子类类型必须能够替换掉它们的父类型、并出现在父类能够出现的任何地方。它指导我们如何正确地进行继承和派生,并合理地重用代码。此原则认为,一个软件实体如果使用一个基类的话,那么一定适用于其子类,而且这根本不能察觉出基类对象和子类对象的区别。
- LSP的内容
*子类型可以增加方法,但不可删
- 子类必须完全实现父类的方法,在类中调用其他类时务必要使用父类或接口,如果不能使用父类或接口,则说明类的设计已经违背了里氏替换原则。
*子类型中重写的方法必须有相同或子类型的返回值
*子类型中重写的方法必须使用同样类型的参数
*子类型中重写的方法不能抛出额外的异常
同时,这也可以体现在方法的规约上面。
Same or stronger invariants 更强的不变量
Same or weaker preconditions 更弱的前置条件
Same or stronger postconditions 更强的后置条件