《设计模式之禅(第二版)》 摘录篇-------里氏替换原则

里氏替换原则定义:

第一种定义,也是最正宗的定义:If for each object o1 of type S there is an object o2 of
type T such that for all programs P defined in terms of T,the behavior of P is unchanged when o1 is
substituted for o2 then S is a subtype of T.(如果对每一个类型为S的对象o1,都有类型为T的对
象o2,使得以T定义的所有程序P在所有的对象o1都代换成o2时,程序P的行为没有发生变
化,那么类型S是类型T的子类型。)

第二种定义:Functions that use pointers or references to base classes must be able to use
objects of derived classes without knowing it.(所有引用基类的地方必须能透明地使用其子类的
对象。)
第二个定义是最清晰明确的,通俗点讲,只要父类能出现的地方子类就可以出现,而且
替换为子类也不会产生任何错误或异常,使用者可能根本就不需要知道是父类还是子类。但
是,反过来就不行了,有子类出现的地方,父类未必就能适应。

 

里氏替换原则为良好的继承定义了一个规范,一句简单的定义包含了4层含义。
1.子类必须完全实现父类的方法

2.子类可以有自己的个性(有子类出现的地方父类未必就可以出现。)

3.覆盖或实现父类的方法时输入参数可以被放大

    如果输入参数缩小的话,子类在没有覆写父类的方法的前提下,子类方法被执行了,这会引起业务
逻辑混乱。所以子类中方法的前置条件必须与超类中被覆写的方法的前置条件相同或者更宽松。

4. 覆写或实现父类的方法时输出结果可以被缩小

  父类的一个方法的返回值是一个类型T,子类的相同方法(重载或覆写)的返回值为S,那么里氏替换原则就要求S必须小于等于T,也就是说,要么S和T是同一个类型,要么S是T的子类。

   子类覆写父类的方法,天经地义。如果是重载,则要求方法的输入参数类型或数量不相同,在
里氏替换原则要求下,就是子类的输入参数宽于或等于父类的输入参数,也就是说你写的这
个方法是不会被调用的。

   采用里氏替换原则的目的就是增强程序的健壮性,版本升级时也可以保持非常好的兼容
性。即使增加子类,原有的子类还可以继续运行。在实际项目中,每个子类对应不同的业务
含义,使用父类作为参数,传递不同的子类完成不同的业务逻辑,非常完美!

     在项目中,采用里氏替换原则时,尽量避免子类的“个性”,一旦子类有“个性”,这个子
类和父类之间的关系就很难调和了,把子类当做父类使用,子类的“个性”被抹杀——委屈了
点;把子类单独作为一个业务来使用,则会让代码间的耦合关系变得扑朔迷离——缺乏类替
换的标准。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值