里氏替换原则
“所有引用基类的地方必须能透明地使用其子类的对象”
“注意 在类中调用其他类时务必要使用父类或接口,如果不能使用父类或接口,则说明类的设计已经违背了LSP原则。”
“在具体应用场景中就要考虑下面这个问题了:子类是否能够完整地实现父类的业务,否则就会出现像上面的拿枪杀敌人时却发现是把玩具枪的笑话。”
“注意 如果子类不能完整地实现父类的方法,或者父类的某些方法在子类中已经发生“畸变”,则建议断开父子继承关系,采用依赖、聚集、组合等关系代替继承。”
“里氏替换原则可以正着用,但是不能反过来用。在子类出现的地方,父类未必就可以胜任。”
子类可以赋值给父类,但是父类不可以赋值给子类。
如果参数是父类,那么可以放一个子类进去,如果参数是子类对象,那么不可以放父类对象进去。
“覆盖或实现父类的方法时输入参数可以被放大”
“子类中方法的前置条件必须与超类中被覆写的方法的前置条件相同或者更宽松。”
“覆写或实现父类的方法时输出结果可以被缩小”
“在项目中,采用里氏替换原则时,尽量避免子类的“个性”,一旦子类有“个性”,这个子类和父类之间的关系就很难调和了,把子类当做父类使用,子类的“个性”被抹杀——委屈了点;把子类单独作为一个业务来使用,则会让代码间的耦合关系变得扑朔迷离——缺乏类替换的标准”