通俗点讲,只要父类能出现的地方子类就可以出现,而且替换为子类也不会产生任何错误或异常,使用者可能根本就不想要知道是父类还是子类。但是,反过来就不行了,有子类出现的地方,父类未必就能适应。
1.子类必须完全实现父类的方法
我们在做系统设计时,经常会定义一个接口或抽象类,然后编码实现,调用类则直接传入接口或抽象类,其实这里已经使用了里氏替换原则。
继承接口要实现所有方法,继承抽象类实现所有抽象方法。
2.子类可以有自己的个性
3.覆盖或实现父类方法时输入参数可以被放大
Override 覆写 覆盖父类的方法
Overload 重载 方法名相同但参数不同
当子类Overload重载方法参数范围小于父类方法的参数时,当子类代替父类时,很可能会在子类没有覆写父类方法的前提下,子类方法被执行了,这样会引起业务逻辑混乱。
子类中方法的前置条件必须与超类中杯覆写的方法的前置条件相同或者更宽松。
4.覆写或实现父类的方法时输出结果(范围)可以被缩小
采用里氏替换原则时,尽量避免子类的“个性”,一旦子类有个性,这个子类和父类之间的关系就很难调和了,把子类当做父类使用,子类的个性被抹杀了,把子类单独作为一个业务来使用,则会让代码间的耦合关系变得扑朔迷离,缺乏类的替换的标准。