六大设计原则之二:里氏替换原则

定义

里氏替换原则(Liskov Substitution Principle,LSP)有两个定义。第一个定义是:

If for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T, the behavior of P is unchanged when o1 is substituted for o2 then S is a subtype of T.(如果每一个类型S的对象o1,都有一个类型T的对象o2,在以T定义的所有程序P中将所有的对象o2都替换为o1,而程序P的行为没有发生变化,那么S是T的子类。)

第一个定义说的云里雾里的,其实意思就是说:在一个程序中,如果可以将一个类T的对象全部替换为另一个类S的对象,而程序的行为没有发生变化,那么S是T的子类。

里氏替换原则的第二个定义是:

Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it.(所有引用基类的地方必须能透明地使用其子类对象。)

第二个定义明显要比第一个定义更容易理解。通俗地讲,就是任何一个使用父类的地方,你都可以把它替换成它的子类,而不会发生任何错误或异常。

大家可能会觉得很奇怪,为什么里氏替换原则会有两个定义呢?下面我们来分析一下。

如果我们有A和B两个条件:

A条件:在用类T的对象o1定义的程序P中,将o1全部替换为类S的对象o2,而程序P的行为没有发生变化;

B条件:类S是类T的子类。

根据里氏替换原则的第一个定义,A条件可以推导出B条件;根据里氏替换原则的第二个定义,B条件可以推导出A条件。所以,里氏替换原则其实就是:A条件和B条件互为充要条件。

意义

继承,是面向对象语言非常优秀的语言机制。里氏替换原则的意义,就是规范继承的用法,让我们最大限度地发挥继承的优点。

你可能感兴趣的:(六大设计原则之二:里氏替换原则)