Type Hierarchy下前置/后置条件判定:如何区分子类与父类约束强弱
类型层级下子类前后置条件强弱判定规则
这个判定规则本质是里氏替换原则(LSP)在类继承场景下的强制要求,具体判定逻辑如下:
前置条件(方法执行前调用方必须满足的约束)
- 更弱约束:子类允许的合法输入范围 大于 父类要求的输入范围。比如父类要求入参必须是大于10的正整数,子类仅要求入参是大于0的正整数,所有能传给父类的合法入参都能直接传给子类,符合替换要求。
- 更强约束:子类允许的合法输入范围 小于 父类要求的输入范围。比如父类允许入参大于10,子类要求入参大于15,原本能正常传给父类的入参12传到子类就会触发校验失败,破坏类的替换性,属于不合法的继承实现。
后置条件(方法执行完成后必须满足的输出约束)
- 更强约束:子类输出满足的规则 比父类更严格。比如父类保证返回值是大于0的正整数,子类保证返回值是大于10的正整数,所有子类的返回结果天然满足父类的后置条件,调用方按父类规则处理子类返回值不会出问题。
- 更弱约束:子类输出满足的规则 比父类更宽松。比如父类要求返回值大于0,子类仅保证返回值大于-5,调用方按父类预期拿大于0的结果时,可能拿到0、-3等不符合预期的值,属于不合法的继承实现。
核心总结:合法的类继承必须满足「子类前置条件不能强于父类,子类后置条件不能弱于父类」的规则。
内容的提问来源于stack exchange,提问作者Nam Trường
相关产品推荐
相关产品推荐

