里氏替换原则(LSP),The Liskov Substitution Principle
定义
所有引用基类的地方必须能透明地引用其子类的对象,即子类可以拓展父类的功能,但不能修改父类已有的功能。
也就是说在父类出现的地方子类也可以出现,并且替换为子类也不会报错,引用者根本不需要知道引用的是父类还是子类,但是反过来就行不通了,子类出现的地方父类就不一定能出现并代替子类。
里氏替换原则的特点:
1、子类可以拓展父类的功能,但不能修改父类已有的功能,如果修改了父类已有的功能,可能导致父类定义的功能在子类覆盖后不适用。
3、实现父类的抽象方法时,子类的方法输出结果应该比父类更加严格。
4、子类可以有自己独特的私有方法,但是需要注意的是,如果子类不能完全实现父类的方法,或者父类的某一些方法在子类中已经不适用,这种情况则建议断开父子关系,使用组合等方式代替继承出现。
里氏替换原则的优缺点:
1、合理得用类的继承关系,提高了代码的复用性,但也增强了类与类之间的耦合性。
2、通过建立抽象,运行过程中具体实现取代抽象,保证了系统的可拓展性。
3、只要继承父类就拥有父类的全部属性和方法,这样减少了代码重复创建量共享了代码但也约束了子类的行为,降低了系统灵活性。
我们平时开发中可能没考虑这么多,乱覆盖父类的方法,没有多少联系的继承等很多打破了里氏替换的原则,这样不顾后果的后果就是我们写的程序存在着潜在的漏洞,而且出问题的机率也会显著提升。