知识卡片
契约在子类化中的强化与减弱规则
内容
继承的危险之一是子类重定义操作时可能和超类的承诺不一致,[[按契约设计的三种断言|契约]]限制子类能改什么来防止这种不一致:不变式和后置条件必须应用到所有子类,子类只能加强、不能减弱;前置条件则相反,只能减弱、不能加强。这个反直觉的规则背后是[[泛化与可替换性|可替换性原则]]——若子类加强了前置条件,超类操作按超类契约调用子类实例时就可能失败,破坏了动态绑定的基础。
参考来源
- 位置:《UML精粹:标准对象建模语言简明指南(第3版)》第3章《类图:基础》(源文件:_epub-src/EPUB/2.xhtml)
- 结论依据:原文明确"类的不变式和后置条件必须应用于所有子类。子类可以选择加强这些断言,但不能减弱。另一方面,前置条件不能被加强,但可以被减弱",并说明这是为了"允许动态绑定……如果一个子类加强了其前置条件,超类操作应用到子类时会失败"。
- 原始内容:断言在子类化中扮演了独一无二的角色……类的不变式和后置条件必须应用于所有子类。子类可以选择加强这些断言,但不能减弱。另一方面,前置条件不能被加强,但可以被减弱……如果一个子类加强了其前置条件,超类操作应用到子类时会失败。