里氏代换原则(Liskov Substitution Principle LSP)
面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,通俗的来讲就是:子类可以扩展父类的功能,但不能改变父类原有的功能,所以里氏代换原则是对实现抽象化的具体步骤的规范。
优点
1.代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性;
2.提高代码的重用性;
3.子类可以形似父类,但又异于父类,“龙生龙,凤生凤,老鼠生来会打洞”是说子拥有父的“种”,“世界上没有两片完全相同的叶子”是指明子与父的不同;
4.提高代码的可扩展性,实现父类的方法就可以“为所欲为”了,君不见很多开源框架的扩展接口都是通过继承父类来完成的;
5.提高产品或项目的开放性。
缺点
1.继承是侵入性的。只要继承,就必须拥有父类的所有属性和方法;
2.降低代码的灵活性。子类必须拥有父类的属性和方法,让子类自由的世界中多了些约束;
3.增强了耦合性。当父类的常量、变量和方法被修改时,需要考虑子类的修改,而且在缺乏规范的环境下,这种修改可能带来非常糟糕的结果————大段的代码需要重构。
调用规则:
1.子类赋给父类(父类引用指向子类实例),允许;
2.父类赋给子类(子类引用指向父类实例),强转;
3.父类引用只能调用子类从父类继承的方法;
4.当子类重写父类方法后,父类引用调用的是子类重写的方法,否则调用子类从父类继承的方法。