[0] [七大原则] ( 7 ) 里氏替换原则 liskov substitution

总结

  • 里氏替换原则的场景和作用?
    what
    是实现抽象化的一种规范
    .
    when
    在为已存在的class进行扩展,
    来创建一个新的子类时.
    .
    how
    里氏替换原则,
    对子类进行了约束.
    .
    why
    符合里氏替换原则的扩展,
    不会给已有的系统引入新的错误.


  • 约束一
    子类可以扩展父类的功能, 但不能改变父类原有的功能.
    (具体做法就是, 只实现父类的抽象方法, 不要去覆盖父类的非抽象方法.)
    .
    所有子类的行为功能, 必须和使用者对其父类的期望保持一致.
    .
    (这能提高程序的维护性,降低需求变更时引入的风险)

image




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

image




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




java例子

image




  • 代码存在的问题?
    Square对Rectangle的继承,类违反了里氏替换原则,
    在这个场景中, 它们之间的继承关系不成立,正方形不是长方形。
    (尽管数学上长方形包括正方形)


  • 什么情况下可以继承? 标准是什么?
    面向对象的设计关注的是对象的行为,
    它是使用"行为"来对对象进行分类的,
    只有行为一致的对象才能抽象出一个类来。
    .
    长方形的行为:
    设置长方形的长度的时候,
    它的宽度保持不变,
    设置宽度的时候,
    长度保持不变。
    .
    正方形的行为:
    设置正方形的长度的时候,宽度随之改变;
    设置宽度的时候,长度随之改变。
    .
    所以
    如果我们把这种行为加到父类长方形的时候,
    就导致了正方形无法继承这种行为.


  • 设计要依赖于用户需求
    在生物学上, 鸵鸟肯定是一种鸟,是一种继承关系。
    .
    但是在OOP中,
    A需求期望鸟类提供与飞翔有关的行为,
    即但在A需求范围内,鸵鸟在飞翔这一点上跟其它普通的鸟是不一致的,它没有这个能力,
    所以,鸵鸟类无法从鸟类派生,鸵鸟不是鸟。
    .
    B需求期望鸟类提供与羽毛有关的行为,
    虽然它不会飞,但是这一点不在B需求范围内,
    所以,它具备了鸟类全部的行为特征,鸵鸟类就能够从鸟类派生,鸵鸟就是鸟。
    image

posted @ 2023-10-22 03:31  qwertzxc  阅读(20)  评论(0)    收藏  举报