设计模式六大原则之里氏替换原则
OO中继承的包含一层这样的含义:父类中凡是已经实现好的方法,实际上是在设定规范的契约,虽然它不强制要求所有的父类遵循这些契约,但是如果子类对这些已经实现的方法任意修改,就会对整个继承体系造成破坏。
继承在给程序设计带来便利的同时,也带来了弊端。比如使用继承会给程序带入侵入性,程序的可移植性降低,增加对象间的耦合性,如果一个类被其他的类所继承,则当这个类需要修改的时候,必须考虑到所有的子类,并且父类修改后,所有涉及到子类的功能都有可能产生故障。
继承优点:提高代码复用性、可扩展性
继承缺点:侵入性(只要继承就必须拥有父类的所有方法和属性,一定程序约束子类);耦合性增强(父类修改时需要考虑所有子类,很可能造成子类功能出现故障)
一、里氏替换原则
在使用继承时,遵循里氏替换原则,在子类中尽量不要重写父类的方法。
里氏替换原则告诉我们,继承实际上让两个类耦合性增强,在适当的情况下,可以通过聚合、组合、依赖来解决问题
二、案例演示
案例地址:https://github.com/Simple-Coder/design-pattern
1、代码实现
问题:发现原有正常的相减功能发生了错误,原因就是B类无意中重写了父类的方法,造成原有功能出现错误,在实际编程中,我们常常会通过重写父类的方法完成新的功能,这样写起来虽然简单,但整个继承体系的复用性会比较差
通用做法:原来的父类和子类都继承一个更加通俗的基类,原有的继承关系去掉,采用依赖、聚合、组合等关系代替。
2、UML类图比较
原有B是继承A,现在将B类提升,使其成为Base的子类,如果B类还要用到A类,可以采用依赖、聚合、组合等关系,这样就满足了里氏替换原则。
三、总结
里氏替换原则,一句话:在子类中尽量不要重写父类的方法