文章来源:http://www.zretc.com/technologyDetail/478.html
"里氏替换原则"听起来非常的复杂,但是设计思想却是非常基础的。看下面这个有趣的海报——
里氏替换原则海报
这一原则描述了:
"子类型必须能够替换它们的基类。"
或者, 换句话说:
"使用基类引用的函数必须能够使用派生类而无须了解派生类。"
同学:对不起, 这听起来让我觉得有点乱。我认为这个是面向对象编程的基本原则。这个叫做多态性, 对吧? 为什么面向对象设计原则需要考虑这个问题?
小卓:非常好的问题!这有一些答案:
在基本的面向对象原则中,"继承" 通常被描述成 "is a" 的关系。如果一个 "开发者" 是"软件专业人员",那么 "开发者" 类 应该继承 "软件开发人员" 类。这样的 "Is a" 关系在类设计阶段非常重要,但是这也很容易让设计者得意忘形从而以一个糟糕的继承设计告终。
"里氏替换原则" 仅仅是一种确保继承被正确使用的手段。
同学:我明白了,真有趣!
小卓:是的,确实如此。让我们来看看一个例子:
类层次结构图展示的是一个Liskov替换原则的例子。因为 KingFisher(翠鸟)类拓展(继承)了Bird类,因此继承了Fly()这个方法,这是非常不错的。
我们再来看看下面的例子:
修正过的Liskov替换原则的类层次结构图
Ostrich(鸵鸟)是一种鸟(显然是),并继承了 Bird 类。但它能飞吗?不能,这个设计就违反了里氏替换原则。
因此,即使在现实中看上去没什么问题,在类设计中,Ostrich 都不应该继承 Bird 类,而应该从 Bird 中分出一个不会飞的类,由 Ostrich 继承。
同学:好吧,明白了。我说说为什么里氏替换原则如此重要:
· 如果不遵循 LSP原则,类继承就会混乱。如果子类实例被作为参数传递给方法,后果难以预测。
· 如果不遵循 LSP原则,基于父类编写的单元测试代码将无法成功运行子类。
我说的对吗?
小卓:完全正确,你可以设计一个对象并用LSP作为验证工具来测试该对象是否能够继承。
下一篇文章,我们将讨论“面向对象之接口隔离原则”
出处:开源中国
译者:K6F, 凡程子, 叫我蝴蝶吧, 王薇, 人头马没面, 铂金小龟, 风子, nikeff1108, sigai
链接:http://www.oschina.net/translate/how-i-explained-ood-to-my-wife?lang=chs&page=4#
了解更多软件开发常见原则问题欢迎登陆中软国际教育集团技术知识库!