Barbara Liskov说: 这里需要如下替换性质-----若对每个类型S的对象o1,都存在一个类型T的对象o2,使得在所有针对T编写的程序P中,用o1替换o2后,程序P的行为功能不变,则S是T的子类型.
上面的就是Liskov替换原则,换句话说,就是子类型(sub type)必须能够替换掉它们的基类型(base type).
对于LSP的违反也潜在的违反了OCP.如果新派生类的创建会导致我们改变基类,这就常常意味着设计是有缺陷的,当然也违反了OCP.
LSP得出的重要结论: 一个模型,如果孤立的看,并不具有真正意义上的有效性.模型的有效性只能通过它的客户程序来表现.
IS-A: 我们经常说IS-A,满足这个关系的就说是继承. 的确,如果一个新类型的对象被认为和一个已有类的对象之间满足IS-A关系,那么这个新对象的类应该从这个已有对象的类派生.
这里需要注意一点: IS-A是关于行为的.从行为方式的角度来看,对象的行为方式菜市软件真正所关注的问题. LSP清楚的指出, OOD中IS-A关系是就行为方式而言的,行为方式是可以进行合理假设的,是客户程序所依赖的.
在这里提出基于契约设计(Design By Contract, DBC)
使用DBC,类的编写者显示的规定针对该类的契约. 客户代码的编写者可以通过该契约获悉可以以来的行为方式. 契约是通过为每个方法声明的前置条件(preconditions) 和后置条件(postconditions)来指定的.要使一个方法得以执行,前置条件必须要为真. 执行完毕后,该方法要保证后置条件为真.
派生类的前置条件和后置条件规则: 在重新声明派生类中的例程(routine)时, 只能使用相等或者更弱的前置条件来替换原始的前置条件,只能使用相等或者更强的后置条件来替换原始的后置条件.