设计模式六大原则---里氏替换(类继承)

一.定义

1:里氏替换原则(Liskov Substitution Principle,LSP)由麻省理工学院计算机科学实验室的里斯科夫(Liskov)女士在 1987 年的“面向对象技术的高峰会议”(OOPSLA)上发表的一篇文章《数据抽象和层次》(Data Abstraction and Hierarchy)里提出来的,她提出:继承必须确保超类所拥有的性质在子类中仍然成立(Inheritance should ensure that any property proved about supertype objects also holds for subtype objects)。

2:里氏替换原则主要阐述了有关继承的一些原则,也就是什么时候应该使用继承,什么时候不应该使用继承,以及其中蕴含的原理。里氏替换原是继承复用的基础,它反映了基类与子类之间的关系,是对开闭原则的补充,是对实现抽象化的具体步骤的规范。

二.实现方法

子类可以扩展父类的功能,但不能改变父类原有的功能。也就是说:子类继承父类时,除添加新的方法完成新增功能外,尽量不要重写父类的方法。

三.违背里氏替换原则的场景

1:通过重写父类的方法来完成新的功能。这样写起来虽然简单,但是整个继承体系的可复用性会比较差,特别是运用多态比较频繁时,程序运行出错的概率会非常大。例如:父类是鸟,包含两个行为,吃东西和飞翔,子类是喜鹊和鸵鸟,很明显鸵鸟不会飞,必须重写鸵鸟类的飞翔方法,因此鸵鸟继承鸟违背了里氏替换原则。

四.解决违背里氏替换原则

1:取消原来的继承关系,重新设计它们之间的关系。

五.代码

1:代码如下所示,因为鸵鸟不会飞翔,因此鸵鸟类重写父类的fly方法,此处方便演示,直接抛出异常。
设计模式六大原则---里氏替换(类继承)_第1张图片
设计模式六大原则---里氏替换(类继承)_第2张图片
设计模式六大原则---里氏替换(类继承)_第3张图片
2:在出现父类bird(鸟)的地方,出现magpie(喜鹊)没有问题,但是出现Ostrich(鸵鸟)就不可以了,因为调用fly方法的时候会抛出异常。
设计模式六大原则---里氏替换(类继承)_第4张图片

六.作用

1:里氏替换原则是实现开闭原则的重要方式之一。
2:它克服了继承中重写父类造成的可复用性变差的缺点。
3:它是动作正确性的保证。即类的扩展不会给已有的系统引入新的错误,降低了代码出错的可能性。

你可能感兴趣的:(设计模式剖析)