LSP:Liskov替换原则=里氏替换原则。
子类型(subtype)必须能够替换掉他们的基类型(basetype)
如果能够理解OCP:开放封闭原则。
那么就能理解LSP:Liskov替换原则 是一种约定。 它的前提是你的程序是基于OCP设计的。即通过抽象类和接口这种上层抽象将变化封存。所以在编码当中我们会优先使用这些抽象类及接口作为方法参数传递。
LSP:Liskov替换原则 是什么?
Barbara Liskov 这个人发现了一个替换性质,只有子类能够替换父类时不影响程序功能,才能称这个类是父类的子类型,否则程序就可能会出错。因为我们可以随意扩展子类,所以会导致出现搅乱父类原有功能的情况。我们无法放心的使用父类或接口,那么自然也就无法实现OCP了。
有一个经典例子是:正方形继承矩形。我们都学过正方形是特殊的矩形。矩形有长和宽。正方形长和宽一样。矩形设置长 setLength(int),设置宽setWith(int)。正方形继承了这两个方法,但是正方形四条边都一样,我们需要覆盖原有的方法让设置宽时能设置长,设置长时能设置宽。但是这种做法会给其它的开发者带来麻烦,例如计算面积时,设置了正方形宽为8,长为10 结果竟然是100而不是预期的80。你可能会说增加一个设置边的方法。但是这违反OCP。
所以说要使用成面向对象编程的这种灵活特性来就必须要做此约定。
假设扩展子类时子类的行为和父类的行为不一致了。那么不要怀疑,一定不要以扭曲父类行为的方式来达成目的。
解决这个问题可以增加一层抽象图形,图形中可以定义抽象方法计算面积。设计矩形和正方形来继承图形类。各自实现自己的设置边的方法计算面积的方法。