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

面向对象设计原则:

一、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(不论长宽)则都会同时增长,陷于死循环。

如图:


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


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

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

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


重复一下

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

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

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


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


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值