里氏代换原则(Liskov Substitution Principle)

作用

它指导我们如何正确地进行继承与派生,并合理地重用代码!

定义

子类型必须能够替换掉它们的父类型、并出现在父类能够出现的任何地方。

这个就是尽量用多态的方法编程,也就是GRASP模式中的多态。

如果对于每一个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1定义的所有程序P在所有的对象o1都代换成o2时,程序P的行为没有变化,那么类型T2是类型T1的子类型。

换言之,一个软件实体如果使用的是一个基类的话,那么一定适用于其子类,而且它根本不能察觉出基类对象和子类对象的区别。

反过来代换不成立。

里氏替换原则要点:

1)对于LSP的违反也潜在的违反了OCP

2)正方形从长方形继承的例子微妙的违反了这种原则

3)在考虑一个特定的设计是否恰当时,不能孤立地来看这个解决方案,必须根据设计的使用者所做出的合理假设来审视它

4)对象的行为方式是软件真正所关注的问题,IS A 关系是就行为而言的

5)派生类只能使用相等或更弱的前置条件来替换原始的前置条件,只能使用相等或更强的前置条件来替换原始的后置条件。

6)完成的功能少于基类的派生类通常不能替换基类,也不符合LSP

7)派生类不应该抛出基类不能预计的异常,否则违反LSP

里氏代换原则分析

里氏代换原则可以通俗表述为:在软件中如果能够使用基类对象,那么一定能够使用其子类对象。把基类都替换成它的子类,程序将不会产生任何错误和异常,反过来则不成立,如果一个软件实体使用的是一个子类的话,那么它不一定能够使用基类。

里氏代换原则是实现开闭原则的重要方式之一,由于使用基类对象的地方都可以使用子类对象,因此在程序中尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型,用子类对象来替换父类对象。

相关文章

适配器模式将一个类的接口转换成客户期望的另一个接口,使得原本接口不兼容的类可以相互合作。
策略模式定义了一系列算法族,并封装在类中,它们之间可以互相替换,此模式让算法的变化独立于使用算法...
设计模式讲的是如何编写可扩展、可维护、可读的高质量代码,它是针对软件开发中经常遇到的一些设计问题...
模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,使得子类可以在不改变算法结...
迭代器模式提供了一种方法,用于遍历集合对象中的元素,而又不暴露其内部的细节。
外观模式又叫门面模式,它提供了一个统一的(高层)接口,用来访问子系统中的一群接口,使得子系统更容...