What:liskov替换原则
子类必须能够替换其基类。这一思想体现为对继承机制的约束规范,只有子类能够替换基类时,才能保证系统在运行期内识别子类,这是保证继承复用的基础。
If for each object 01 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 when o1 is substituted for o2 then s is subtype of T
如果对每一个类型为S的对象o1,都有类型为T的对象o2。使得以T定义的所有程序P在所有的对象O1都能替换成O2时,程序P的行为没有发生变化,那么类型S是类型T的子类。
所有引用基类的地方必须能够透明地使用其子类对象。
how
1.子类必须要完全实现父类的方法:使用抽象接口来定义传入或者传出的对象类型。
2.子类可以有自己的个性:比如接口的现实就是如此,扩展了接口或者抽象类型
3.覆盖或者实现父类的方法时输入参数可以放大:面向接口编程
4.覆盖或实现父类的方法时输出结果可以被缩小:父类的一个方法的返回值是一个类型T子类的相同方法(重载或覆写)的返回值为S,那么里氏替换原则就要求S必须小于等于T,也就是说,要么S和T是同一个类型,要么S是T的子类,为什么呢?分两种情况:
如果是覆写,父类和子类的同名方法的输入阐述是相同的,两个方法的范围值S小于等于T,这是覆写的要求,这才是重中之重,子类覆写父类的方法,天经地义
如果是重载,则要求方法的输入参数类型或数量不相同,在里氏替换原则要求下,就是子类的输入参数宽于或等于父类的输入参数,也就是说你写的这个方法是不会被调用的。
在开发中比较常见的如:http请求的callback回掉事件,都是写抽象的接口作为传入参数,实际中是使用各种实现的接口