作用
它指导我们如何正确地进行继承与派生,并合理地重用代码!
定义
子类型必须能够替换掉它们的父类型、并出现在父类能够出现的任何地方。
这个就是尽量用多态的方法编程,也就是GRASP模式中的多态。
如果对于每一个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1定义的所有程序P在所有的对象o1都代换成o2时,程序P的行为没有变化,那么类型T2是类型T1的子类型。
换言之,一个软件实体如果使用的是一个基类的话,那么一定适用于其子类,而且它根本不能察觉出基类对象和子类对象的区别。
反过来代换不成立。
里氏替换原则要点:
1) 对于LSP的违反也潜在的违反了OCP
2) 正方形从长方形继承的例子微妙的违反了这种原则
3) 在考虑一个特定的设计是否恰当时,不能孤立地来看这个解决方案,必须根据设计的使用者所做出的合理假设来审视它
4) 对象的行为方式是软件真正所关注的问题,IS A 关系是就行为而言的
5) 派生类只能使用相等或更弱的前置条件来替换原始的前置条件,只能使用相等或更强的前置条件来替换原始的后置条件。
6) 完成的功能少于基类的派生类通常不能替换基类,也不符合LSP
7) 派生类不应该抛出基类不能预计的异常,否则违反LSP
里氏代换原则分析
里氏代换原则可以通俗表述为:在软件中如果能够使用基类对象,那么一定能够使用其子类对象。把基类都替换成它的子类,程序将不会产生任何错误和异常,反过来则不成立,如果一个软件实体使用的是一个子类的话,那么它不一定能够使用基类。
里氏代换原则是实现开闭原则的重要方式之一,由于使用基类对象的地方都可以使用子类对象,因此在程序中尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型,用子类对象来替换父类对象。