软件构造——LSP


一、LSP的概念

里氏替换原则(Liskov Substitution Principle) LSP:如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有对象o1都替换成o2时,程序P的行为没有发生变化,那么类型S是类型T的子类型。
通俗点讲,只要父类能出现的地方子类就可以出现,而且替换为子类也不会产生任何错误或异常,使用者根本不需要知道是父类还是子类,在继承时,子类中尽量不要去重写父类方法。
但是反过来就不行了,有子类出现的地方,父类未必能适应。
在这里插入图片描述
接下来在让我们看看LSP中的具体原则有哪些
①子类型可以增加方法,但不可删
②子类型需要实现抽象类型中的所有未实现方法
③子类型中重写的方法必须有相同或子类型的返回值或者符合co-variance的参数
④子类型中重写的方法必须使用同样类型的参数或者符合contra-variance的参数
⑤子类型中重写的方法不能抛出额外的异常
以上的原则都是JAVA编译器可以检查出来的

还有一些是Java编译器检查不出来的,需要我们自己去检查的
A.更强的不变量
B.更弱的前置条件
C.更强的后置条件

二、典例

正方形能否继承长方形?

在这里插入图片描述
这里对长方形宽的改变就破坏了它的RI。这时我们就需要对方法进行重写。
在这里插入图片描述
但是如果子类对父类的抽象方法任意修改,就会对整个继承体系造成破坏。这样写起来虽然简单,但是整个继承体系的可复用性会比较差,特别 是运用多态比较频繁时,程序运行出错的几率非常大。如果非要重写父类的方法,比较通用的做法是:原来的父类和子类都继承一个更通俗的基类,原有的继承关系去掉,采用依赖、聚合,组合等关系代替。

猜你喜欢

转载自blog.csdn.net/m0_50906780/article/details/117734576
LSP
今日推荐