知识卡片

覆写方法的前置条件只能放大不能收紧

普通读书笔记卡 · 1983.a.2.a

内容

方法输入参数类型是”前置条件”。子类覆写方法若缩小参数类型范围(父类接受Map、子类只接受 HashMap),按[[里氏替换原则的两种定义]]用子类替换父类调用时窄化方法会被意外执行,歪曲 父类契约。正确方向相反:子类参数类型须与父类相同或更宽松。发散:这与Java重载解析规则 不同——重载看选中哪个版本,LSP关心选中后是否违反父类承诺。

参考来源

- 位置:《设计模式之禅(第2版)》第2章《里氏替换原则》(源文件:_epub-src/text/part0009.html) - 结论依据:原文对比父类前置条件大于/小于子类两种情况的代码示例,指出当父类前置条件更宽(Map)而子类更窄(HashMap)时,用子类替换父类调用会导致子类窄化方法被意外执行,从而推出"子类中方法的前置条件必须与超类中被覆写的方法的前置条件相同或者更宽松"的规则。 - 原始内容:子类的输入参数类型的范围扩大了,子类代替父类传递到调用者中,子类的方法永远都不会被执行……子类中方法的前置条件必须与超类中被覆写的方法的前置条件相同或者更宽松。