[0] [七大原则] ( 7 ) 里氏替换原则 liskov substitution
总结
-
里氏替换原则的场景和作用?
what
是实现抽象化的一种规范
.
when
在为已存在的class进行扩展,
来创建一个新的子类时.
.
how
里氏替换原则,
对子类进行了约束.
.
why
符合里氏替换原则的扩展,
不会给已有的系统引入新的错误.
-
约束一
子类可以扩展父类的功能, 但不能改变父类原有的功能.
(具体做法就是, 只实现父类的抽象方法, 不要去覆盖父类的非抽象方法.)
.
所有子类的行为功能, 必须和使用者对其父类的期望保持一致.
.
(这能提高程序的维护性,降低需求变更时引入的风险)

- 约束二
当子类method实现父类method时(重写/重载或实现抽象方法),
方法的输出/返回值,
要比父类更严格(或与父类一样).
(这条不用刻意去做, 编译器会负责)

- 约束三
当子类method重载父类的method时,
方法的前置条件(即方法的输入/入参),
比父类方法的输入参数更宽松.
java例子

-
代码存在的问题?
Square对Rectangle的继承,类违反了里氏替换原则,
在这个场景中, 它们之间的继承关系不成立,正方形不是长方形。
(尽管数学上长方形包括正方形)
-
什么情况下可以继承? 标准是什么?
面向对象的设计关注的是对象的行为,
它是使用"行为"来对对象进行分类的,
只有行为一致的对象才能抽象出一个类来。
.
长方形的行为:
设置长方形的长度的时候,
它的宽度保持不变,
设置宽度的时候,
长度保持不变。
.
正方形的行为:
设置正方形的长度的时候,宽度随之改变;
设置宽度的时候,长度随之改变。
.
所以
如果我们把这种行为加到父类长方形的时候,
就导致了正方形无法继承这种行为.
-
设计要依赖于用户需求
在生物学上, 鸵鸟肯定是一种鸟,是一种继承关系。
.
但是在OOP中,
A需求期望鸟类提供与飞翔有关的行为,
即但在A需求范围内,鸵鸟在飞翔这一点上跟其它普通的鸟是不一致的,它没有这个能力,
所以,鸵鸟类无法从鸟类派生,鸵鸟不是鸟。
.
B需求期望鸟类提供与羽毛有关的行为,
虽然它不会飞,但是这一点不在B需求范围内,
所以,它具备了鸟类全部的行为特征,鸵鸟类就能够从鸟类派生,鸵鸟就是鸟。
![image]()

浙公网安备 33010602011771号