1、里氏代换原则
里氏代换原则(Liskov Substitution Principle)是指,任何基类出现的地方,子类一定可以出现。反之则不一定成立。
通俗的讲便是:“老鼠儿子会打洞”。
里氏代换原则是对继承关系的补充,为什么呢?
2、继承关系的特质
代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性提高代码的重用性子类可以形似父类,但是又异于父类。提高代码的可扩展性,实现父类的方法就可以了。许多开源框架的扩展都是通过继承父类或实现接口来完成。提高产品或项目的开放性
在设计一个工具或框架时,不可能面面俱到,满足所有需求,所以需要定制一个规范的接口,让用户自己实现差异化的需求。
这里的父类不仅仅是单纯意义上的父类,更多的代表接口或抽象类。
3、继承关系的缺点
继承是侵入性的,只要继承,就必须拥有父类的所有方法和属性降低了代码的灵活性,子类必须拥有父类的属性和方法,让子类有了一些约束增加了耦合性,当父类的常量,变量和方法被修改了,需要考虑子类的修改,这种修改可能带来非常糟糕的结果,要重构大量的代码。
里氏代换原则目的是为了让继承中的优势发挥到最大,劣势减到最少。
4、里氏代换原则的规范
子类必须完全实现父类的方法子类可以有自己的独特性覆盖或实现父类方法时,输入参数的范围可以被放大覆盖或实现父类方法时,输出结果的范围可以被缩小
1、一般使用接口或抽象类,对外暴露的是接口,而实际应用的是子类。也是多态的应用(继承、重写、父类引用指向子类对象)其中使用到了java的隐式转换。
2、子类可以有自己的行为和外观。里氏代换原则可以正着用,但不能反着用,即子类出现的地方,父类未必可以胜任。但是避免子类有过于突出的个性,一旦子类有过于突出的个性,把子类单独作为一个业务使用,则会让代码间的耦合关系变得难以理解,缺乏替换的标准
3、方法中的输入参数称为前置条件,当子类前置条件大于等于父类约束时,替换成子类,程序的前置条件特征才不会发生畸变,里氏代换原则才成立。
4、同理,为了让运行结果不发生畸变,只有输出结果的范围小于等于父类的约束时,子类扩展才拥有健壮性,版本升级时也可以保持良好的兼容性。即使增加新子类,原有的业务还可以继续运行。
如果觉得《面向对象五大设计原则-里氏代换原则》对你有帮助,请点赞、收藏,并留下你的观点哦!