欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

面向对象设计原则(一)里氏替换原则

程序员文章站 2022-07-13 21:46:18
...

面向对象设计原则:

一、LSP(里氏替换原则)

    1.定义

           i.  如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1都代换成o2时,程序P的行为没有变化,那么类型S是类型T的子类型。

           ii. 所有引用基类(父类)的地方必须能透明地使用其子类的对象。

          上述定义类似于数学上的定义,其实简单来说就是:子类型必须可以替换基类对象。

    2.为达到目的:子类不能添加任何父类没有的附加约束,在可能的情况下,由抽象类(接口)继承。

    3. ①只要有可能,不要从具体类继承。

        ②行为集中地方向是向上的(抽象类)

         ③数据集中的方向是向下的(具体类)

    4.在实际工作中个人建议可以用聚合来尽可能的替代继承(个人建议)

    5.实例:长方形和正方形。

    众所周知,正方形是一种特殊的长方形,那么是否可以理解为长方形是正方形的父类,假设有两个类Rectangle和Square。

面向对象设计原则(一)里氏替换原则

在许多场景下,比如计算面积等,这样做都是可以的;但是在有些情景下,如果按这样来设计的话,程序则会出现一些问题。

比如:Rectangle的属性里有长length和宽width,而正方形里则统一是边side(假设它们都是int类型)。这样更符合我们现实生活。(注意:计算机里长即为长,宽即为宽,如果不作处理计算机不会因为宽大于长而将宽改变为长,方便理解)

 假设有一个方法compare(这里是方便理解所写):当宽小于等于长时,宽+1,直至宽大于长。

    public void compare(){

        while(width<=length){

            width = width + 1;

        }

    }

而如果正方形继承这个方法,那么正方形的边side(不论长宽)则都会同时增长,陷于死循环。

如图:

面向对象设计原则(一)里氏替换原则

接下来,我们根据设计原则来进行修改:

面向对象设计原则(一)里氏替换原则

使用里氏代换原则对其进行重构后,使得系统可以灵活扩展。

总结:子类型必须可以替换基类对象。

重复一下子类不能添加任何父类没有的附加约束,在可能的情况下,由抽象类(接口)继承。

面向对象设计原则(一)里氏替换原则

重复一下

①只要有可能,不要从具体类继承。

②行为集中地方向是向上的(抽象类)

③数据集中的方向是向下的(具体类)


下接:面向对象设计原则(二) 开放-封闭原则


如有错误,还请指出,非常感谢!!