今晚我在 Ward 的 wiki 上看到了 Liskov Substitution Principle 的原始声明:
这里需要的是类似于下面的替换属性:如果对于每个 S 类型的对象 o1 都有一个 T 类型的对象 o2 使得对于所有根据 T 定义的程序 P,当 o1 被替换时 P 的行为不变对于 o2,则 S 是 T 的子类型。” - Barbara Liskov,Data Abstraction and Hierarchy,SIGPLAN Notices,23,5(1988 年 5 月)。
我一直不擅长解析谓词逻辑(虽然我第一次失败了 Calc IV),所以虽然我有点理解上述内容如何转化为:
使用指向基类的指针或引用的函数必须能够在不知情的情况下使用派生类的对象。
我不明白的是为什么 Liskov 描述的属性暗示 S 是 T 的子类型,而不是相反。
也许我对 OOP 的了解还不够,但是为什么 Liskov 的陈述只允许 S -> T 的可能性,而不是 T -> S 的可能性?