随笔-126  评论-247  文章-5  trackbacks-0

里氏代换原则LiskovSubstitution Principle,简称LSP)说的是:一个软件实体如果使用的是一个基类的话,那么一定适用于其子类,而且它根本不能够察觉出基类对象

和子类对象的区别。
也就是说,在软件实体里面,把父类都换成其子类,程序的行为是不会发生变化的。

里氏代换原则LSP):子类型必须能替换掉它的父类型,反过来代换原则不成立。

里氏代换原则是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不会受到影响的时候,基类才能真正被复用,而衍生类也才能够在基类的基础上添加新的行为。


一个简单的例子:现有一个鸟类,一个鸵鸟类,如图:

在面向对象程序设计里面,对于鸵鸟类属不属于鸟类的问题,换句话说就是,鸵鸟类能不能继承鸟类的问题,如图:



答案的否定的。这貌似有些荒唐,在生物界中,鸵鸟隶属鸟纲没有错,

但是在程序里面,鸵鸟类不能继承鸟类,因为根据LSP(里氏代换原则),如果鸵鸟类继承了鸟类,鸟类会飞,那么鸵鸟类也会飞了,但实际上鸵鸟类是不会飞的,只是能奔跑的很快。

在 java 语言中,LSP(里氏代换原则)会在编译期间被检查,当然,这只是与实现无关的,纯语法意义上的检查,如果某一程序违反了这一原则,java 编译器在编译的时候是不会

让其通过的,这时就会出现编译错误。

但事实是,不会飞的鸟和会飞的鸟都属于鸟纲(生物不好,不知道这样说正确与否 *_*,不过不影响后面引出的话题),在程序设计里面看来,它们都有许多共性和特征,像这些

不会飞的鸵鸟、企鹅等和会飞的鸟类,在类的设计上它们的共性体现在属性和方法上,如果都将不会飞的和会飞的鸟类独立,这明显不是一种好的做法,怎么说呢?

最明显不过的一个条是,不管会飞的或不会飞的鸟,它们在上都属于鸟纲,都应该能继承鸟的一般属性和行为,从代码重构的角度来看(糟糕,扯到代码重构了,不过既然问题

已经引出,不妨把它解决掉),可以创建一个抽象的类,作为会飞的和不会飞的两大鸟类的超类,然后就可以将会飞的和不会飞的鸟类的共同行为向上移到超类中,让超类的子类

可以通过继承得到这些行为,从而解决会飞的鸟类和不会飞的鸟类行为不一致的问题。如图:



  
posted on 2012-08-02 13:18 fancydeepin 阅读(867) 评论(1)  编辑  收藏

评论:
# re: 里氏代换原则(LSP)[未登录] 2013-03-15 21:16 | ccc
请问博主:
如果鸵鸟类继承了鸟类,鸟类会飞,那么鸵鸟类也会飞了,但实际上鸵鸟类是不会飞的,只是能奔跑的很快。

这句话本身有问题,"如果鸵鸟类继承了鸟类,鸟类会飞,那么鸵鸟类也会飞了",这句话这么推论是正确的,为什么会出现错误的结果呢?因为前提弄错了,鸟类不一定都会飞。  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: