六大设计原则之里氏替换原则
1、里氏替换原则来源 继承优点: 代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性; 提高代码的重用性; 子类可以形似父类,但又易于父类; 提高代码的可扩展性,实现父类的方法就可以“为所欲为”了; 提高产品或者项目的开放性; 继承缺点: 继承是侵入性的,只要是继承,就必须拥有父类的所有属性和方法; 降低代码灵活性,子类必须拥有父类的属性和方法,子类在自由世界中多了些约束; 增强了耦合性,当父类的常量,变量或者方法被修改时,需要考虑子类的修改 Java用extends关键字来实现继承,它采用了单一继承的规则,而C++则采用了多重继承的规则,一个子类可以继承多个父类。从总体上看,单继承利大于弊。如何把“利”发挥最大作用,同时减少“弊”带来的问题。解决方案就是引入里氏替换原则(LSP)。 如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1都替换成o2时,程序P的行为 没有 发生变化,那么类型S是类型T的子类型。 所有引用基类的地方必须能透明地使用其子类的对象。 对上面第二种解释为“只要父类能出现的地方,子类都可以出现,而且替换为子类也不会产生任何错误或者异常,使用者不需要知道是父类还是子类。但是反过来就不行了,有子类出现的地方,父类未必就能适应。” 2、里氏替换原则规则 a)、子类必须完全实现父类的方法 我们先定义一个枪的接口