程序设计原则之里氏替代原则

一、什么是里氏替代原则

定义:

T1类的对象O1,T2类的对象O2,如果在程序P中将T1的对象O1全部替换成T2的对象O2,程序P的行为不发生变化,则我们说T2是T1的子类。

定义引申:

1、子类可以扩展父类的方法,但最好不要重写覆盖父类已有的非抽象方法。

2、子类重写/重载父类的方法时入参类型的范围不应该缩小,也就是说应该是原入参类型或者是其父类。

3、子类重写/重载父类的方法时出参类型的范围不应该扩大,也就是说应该是原出参类型或者是其子类。

二、分析一个具体的业务场景

场景:

一般我们认为正方形是一种特殊的长方形,可以将正方形申明为长方形的父类。在这么一种情况,当长方形的宽比长小或者等时,我们将长方形的宽进行resize,每次加1。此时我们看一下将正方形申明为长方形的子类是否违反里氏替换原则。

对于长方形的实例在上述的测试示例中是正常的,但是正方形的实例测试调用resize方法时会陷入死循环,所以这里Square类的实例替换Rectangle的实例后程序的行为发生了变化,不符合里氏替换原则,故在此种业务场景中不能将正方形看成是长方形的子类。

下面是用一个公共的接口来进行改进,让其均实现该接口:

此时的实现由于Square类与Rectangle类不再存在继承关系,对于Square类的实例在instanceof Rectangle的判断中是不成立的,故不会对其进行resize的行为。这种做法才符合里氏替代原则。

猜你喜欢

转载自blog.csdn.net/Wenlong_L/article/details/82729743
今日推荐