辉夜的博客

繁花似锦,辉夜如昼

0%

软件构造-李氏原则漫谈"

李氏原则

李氏原则的核心思想就是:所有父类出现的地方,子类都可以出现。
在解释这句话的含义之前,我想请读者回忆一下C标准中的类似表述:一个整形表达式可以出现在任何整形字面量可以出现的地方。可以说,这种表述就是定义了行为的完全兼容性。
这句话的含义有五个方面:

1

概括来说,就是规定了子类型的函数规约和函数签名应当满足的条件。函数规约应该保持或加强,而函数签名应该兼容。
具体而言,子类型的返回值应当是父类型返回值的子类,子类型的参数应当是父类型的参数的父类,子类型不应抛出新的必检异常,可以抛出原先的必检异常及其子类。下面是Java对于重写的语法要求:

2

可以看到,基本的思路是一致的,不过由于java中不同的函数签名被视为不同的函数,所以“参数逆协变”的行为子类重写被视为重载。也是因为如此,java不会检查子类方法是逆协变的还是协变的。但为了编写一个行为子类,我们需要手动的保证这点。

3