首页 > 代码库 > Liskov替换原则

Liskov替换原则

Liskov替换原则是一个关于设计父类和子类关系的原则。

它的定义很有数学感:

若对每个类型S的对象o1,都存在一个类型T的对象o2,使得在所有针对T编写的程序P中,用o1替换o2后,程序P的行为功能不变,则S是T的子类型。

这个很类似于高等数学的根基极限的定义:

一个数列a,对于任何给定的一个正数e,存在一个正整数N,当整数n大于N的时候,a(n)-a‘的绝对值小于e,则称a‘为数列a的极限。

不过个人感觉,这个功能不变定义的相当模糊,功能是一个契约,是一个对客户的承诺,功能的定义很大程度在于客户的看法。比如一个打印的功能,父类是一个普通的打印,子类A是加上时间戳的打印,子类B是不打印。一般都会认为A可以替代父类,B不行。但是在某些情况下B反而是需要的,比如这个程序还掺着其它打印,打印太多反而影响了其它重要的打印。好的做法是创建一个抽象类,这三个类都继承抽象类。

一般来说,接口的功能都是由类的成员属性决定的,如果子类继承的函数直接改变了父类的某个成员属性,子类的这个函数就不能替换父类,这就是一个不好的设计。因为其它另外一个函数可能使用了这个成员属性,这子类中的另外一个函数就不能替换父类。而继承接口就不会存在这个问题,因为接口没有成员属性,另外接口的函数都是抽象的,没有具体的功能。

Liskov替换原则只有在支持面向对象的语言里面才有用,这个和依赖倒置原则不一样,依赖倒置原则是关于模块的。

Liskov替换原则