里氏代换原则(LiskovSubstitution Principle,简称LSP)说的是:一个软件实体如果使用的是一个基类的话,那么一定适用于其子类,而且它根本不能够察觉出基类对象
和子类对象的区别。也就是说,在软件实体里面,把父类都换成其子类,程序的行为是不会发生变化的。
里氏代换原则(LSP):子类型必须能替换掉它的父类型,反过来代换原则不成立。
里氏代换原则是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不会受到影响的时候,基类才能真正被复用,而衍生类也才能够在基类的基础上添加新的行为。
一个简单的例子:现有一个鸟类,一个鸵鸟类,如图:
在面向对象程序设计里面,对于鸵鸟类属不属于鸟类的问题,换句话说就是,鸵鸟类能不能继承鸟类的问题,如图:
答案的否定的。这貌似有些荒唐,在生物界中,鸵鸟隶属鸟纲没有错,
但是在程序里面,鸵鸟类不能继承鸟类,因为根据LSP(里氏代换原则),如果鸵鸟类继承了鸟类,鸟类会飞,那么鸵鸟类也会飞了,但实际上鸵鸟类是不会飞的,只是能奔跑的很快。
在 java 语言中,LSP(里氏代换原则)会在编译期间被检查,当然,这只是与实现无关的,纯语法意义上的检查,如果某一程序违反了这一原则,java 编译器在编译的时候是不会
让其通过的,这时就会出现编译错误。
但事实是,不会飞的鸟和会飞的鸟都属于鸟纲(生物不好,不知道这样说正确与否 *_*,不过不影响后面引出的话题),在程序设计里面看来,它们都有许多共性和特征,像这些
不会飞的鸵鸟、企鹅等和会飞的鸟类,在类的设计上它们的共性体现在属性和方法上,如果都将不会飞的和会飞的鸟类独立,这明显不是一种好的做法,怎么说呢?
最明显不过的一个条是,不管会飞的或不会飞的鸟,它们在纲上都属于鸟纲,都应该能继承鸟的一般属性和行为,从代码重构的角度来看(糟糕,扯到代码重构了,不过既然问题
已经引出,不妨把它解决掉),可以创建一个抽象的类,作为会飞的和不会飞的两大鸟类的超类,然后就可以将会飞的和不会飞的鸟类的共同行为向上移到超类中,让超类的子类
可以通过继承得到这些行为,从而解决会飞的鸟类和不会飞的鸟类行为不一致的问题。如图:
posted on 2012-08-02 13:18
fancydeepin 阅读(879)
评论(1) 编辑 收藏