面向对象设计原则:LisKov替换原则(LSP)

●定义

子类型必须能够替换掉它们的基类型。

●关于“IS-A”

通常说“IS-A”是一个继承关系,如果某个将要被创建的类与现存的某个类满足这种关系,那么这个新类应该从这个现存中继承。

“替换原则”告诉我们怎么样去使用面向对象三大机制中的“继承与多态”。C#语言中(很多语言也是这样的)一个子类是可以转换为其基类的,换句话说 就是对基类的操作同样适用于其子类。这一点看上去十分简单,但在编写代码的时候,我们却可能会被“IS-A”这个基本的面向对象分析方法所误导,在子类在 某些情况下不能够去替换它们的基类。

“敏捷软件开发”一书中例举了一个很好的例子,就是关于矩形与正方形。从通常的“IS-A”关系上来说,正方形就是一个矩形,因而,我们可以从矩形 派生一个正方形。但随之问题就来了。这是很明显的,矩形的长与宽是不一样的,所以这个类它需要两个属性用于设置长与宽;而正方形的长与宽是一样,所以如果 从矩形继承而来,那么,有一部分东西是正方形不需要的。这不是本质的问题,本质的问题在于正方形与矩形的操作形为是不一样的。假设矩形与正方形都是面积的 计算方法,在计算矩形面积时,在设置了长与宽之后(如长4宽5)就可以计算出其面积(面积为20),现在我们的类调用者就是这样做的。但如果换成正方形 呢?在设置了长与宽后(假设正方形从矩形继承,并且我们将一个正方形传给了调用者,调用者通过其类来计算其面积)计算其面积时我们就会发现,正方形这个子 类是不能够取代其基类矩形的。为什么?由于正方形的长与宽相同,所以当你设置了正方形的长度之后,宽度就会相应改变(变为相等),但这种特性不是矩形所拥 有的。显然这不是合适的。

为什么会产生这种问题?这就是“IS-A”所带来的问题。上面所讨论问题的根本之在于“正方形与矩形的行为方式不同”,尽管正方形却是一个长宽相等 的矩形。“IS-A”强调的是行为上的“IS-A”,这种形为是外在且公开的。一个类的行为方式才是设计者真正需要关心的东西,也是调用者所需要依赖的东 西。所以在继承时需要慎重考虑,这种考虑并不能完全基于“某个东西是一个什么东西”,更重要的是要从其操作行为上分析“某个东西从操作行为上看是一个什么 东西”,确保子类不会更改其基类的行为方式。

最后,“IS-A”是OCP原则得以正确应用的主要原则之一,因为它们都是在子类可以替换基类的情况下进行的。违反LisKov替换原则,也会直接或间接的违反OCP原则。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值