里氏替换原则(Liskov Substitution Principle ,LSP):
指的是任何基类可以出现的地方,子类一定可以出现。
定义1
如果对每一个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1定义的所有程序P在所有的对象o1都替换成o2时,程序p的行为没有发生变化,那么类型T2是类型T1的子类型。
定义2
所有引用基类的地方必须能透明地使用其子类对象。
问题由来
有一功能P1,由类A完成。现需要将功能P1进行扩展,扩展后的功能为P,其中P由原功能P1与新功能P2组成。新功能P由类A的子类B来完成,则子类B在完成新功能P2的同时,有可能会导致原有功能P1发生故障。
解决方案
当使用继承时,遵循里氏替换原则。类B继承类A时,除添加新的方法完成新增功能P2外,尽量不要重写父类A的方法,也尽量不要重载父类A的方法。
里氏替换原则包含了四层含义
1.子类可以实现父类的抽象方法,但是不能覆盖父类的非抽象方法。
实践,以枪为例,看一下类图