-
里氏替换原则(https://blog.youkuaiyun.com/zhengzhb/article/details/7281833 ; https://blog.youkuaiyun.com/qq_34966814/article/details/79475977 )
命名由来:这个原则最早于1988年,由麻省理工学院的一位女士(Barbara Liskov 芭芭拉·利斯科夫)提出,以其姓氏命名。
定义1:如果对每一个类型为 T1的对象 o1,都有类型为 T2 的对象o2,使得以 T1定义的所有程序 P 在所有的对象 o1 都代换成 o2 时,程序 P 的行为没有发生变化,那么类型 T2 是类型 T1 的子类型。
-
(所以这是定义了什么是子类吗?)
-
通俗的说,就是在程序中所有使用对象A的地方,把所有的对象A都换成对象B时,程序的运行过程和结果没有发生变化,那么类B就是类A的子类。
-
反过来说,如果类B是类A的子类,那么在所有使用对象A的地方,把对象A换成对象B时,程序运行结果不可以发生变化,否则就不符合里氏替换原则。
定义2:所有引用基类的地方必须能透明地使用其子类的对象。
问题由来:有一功能P1,由类A完成。现需要将功能P1进行扩展,扩展后的功能为P,其中P由原有功能P1与新功能P2组成。新功能P由类A的子类B来完成,则子类B在完成新功能P2的同时,有可能会导致原有功能P1发生故障。
解决方案:当使用继承时,遵循里氏替换原则。类B继承类A时,除添加新的方法完成新增功能P2外,尽量不要重写父类A的方法,也尽量不要重载父类A的方法。
里氏替换原则通俗的来讲就是:子类可以扩展父类的功能,但不能改变父类原有的功能。它包含以下4层含义: -
子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。
-
子类中可以增加自己特有的方法。
-
当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。
-
当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。
-
设计模式六大原则之里氏替换(转+自我理解)
最新推荐文章于 2024-08-15 16:04:07 发布