里氏代换原则(LSP)

里氏代换原则定义: 一个软件实体使用的是一个基类的话,那么一定适用于其子类,这个软件实体察觉不出基类和子类对象的区别。

 

第一个辩证题目:正方形是否是长方形的子类? 答案:不是。

既然正方形也属于长方形的一种特殊形式,满足IS关系,为什么不能是其子类呢?

答:如果我们作成派生关系,为了满足正方形的长、宽相等,当调用正方形的setWidth(),或者setLength()时,必须将同时修改width和length。

但作为软件实体他并不知道这些,如果它有下面类似的函数,参数实例如果是长方形没有问题,但如果换成了子类(正方形)后,这个函数将会陷入死循环。死循环的原因是因为在修改宽度的时候同时修改了长度。。

void AdujstWidth(Rectangle r)
{
    while(r.getWidth() <= r.getLength())
    {
        r.setWidth(r.getWidth() + 1);
    }
}

这样就就违背了里氏代换原则的原则。所以不应该将正方形定义为长方形的子类。

 

 

第二个辩证题目:经理、雇员、学生、老师是不是人的子类? 答案:不是

虽然说经理是人,雇员、学生和老师也是人。

但如果建立这种派生关系后,子类实例化后,人的身份就确认了(特定形态)。

要不是经理,要么是雇员,要么是学生、要么是老师。

但这明显不合符逻辑,因为一个人是经理的同时也可能同时是雇员、学生或老师。

所以这些类应该派生于职业,而不是派生于人。

同样,软件实体操作的对象应该是职业,而不是人。

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值