==========================================================================================================
里氏替换原则(Liskov Substitution Principle:LSP)
1、解释
中文解释:如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1都替换成o2时,程序P的行为不发生
任何变化,那么类型S是类型T的子类型。(所有引用基类的地方必须能透明的使用其子类的对象)
英文解释:If for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T, the behavior
of P is unchanged where o1 is substituted for o2 then S is a subtype of T。(Functions that use pointers or references to base classes
must be able to use object of derived classes without knowing it)
自己理解:里氏替换原则是由于继承机制带来的,产生于子父类之间。该原则是对继承机制的进一步严格规范和要求:子类对象必须能无条件的完全替代父类
对象。而且不会影响程序的变化。(其实,说白了,在编程中大家都用过,就是用子类来代替父类或者接口,但是如果你不按照一定的要求做,替代后程序的执行结果
可能与你替代之前出现差异,为了不出现差异,你在写子类时就必须遵守一定的规则或者条件,这些规则加在一起就组成了”里氏替换原则“,下面一一说明)
2、实用范围
所有需要使用继承机制的地方。
3、里氏替换原则对继承机制定义的规范:
①、子类必须完全实现父类的方法(在类定义时无论是属性还是方法参数尽量使用父类或接口类型,在使用类创建的对象时传入对应的实现类对象或者子类对象。如果子类不能完整的实现父类的方法,或者父类的某些方法在子类中已经发生“畸变”,则建议断开父子继承关系,转而采用依赖、聚集、组合等关系代替继承)。
·
②、子类可以自由扩展(拥有自己的个性,也即有自己的属性和方法),子类对象可以代替父类,但是父类对象不能代替子类对象。
③、子类覆盖或者实现父类的方法时输入参数可以被放大(子类中的方法输入参数可以和父类方法的输入参数同类型,或者是父类方法输入参数的父类型。保证如果子类与父类方法构成重载时传入子类对象调用的方法仍是父类的方法,如果子类重写了父类的方法,则传入子类对象调用的方法是子类的方法)。
④、覆写或实现父类的方法时输出结果(返回值)可以被缩小(子类覆写或实现的方法的返回值必须与父类对应方法的返回值同类型或者是父类对应方法的返回值类型的子类)。
==========================================================================================================