里氏代换原则(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

里氏代换原则分析

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

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

你可能感兴趣的:(设计模式,框架,设计)