为何正方形-矩形问题会违反里氏替换原则(LSP)?
里氏替换原则(LSP)与正方形-矩形问题的违反分析
LSP对子类型的四项行为要求
- 子类型不得强化前置条件
- 子类型不得弱化后置条件
- 子类型不得弱化不变量
- 历史约束(“历史规则”):对象仅可通过其方法修改自身状态
正方形-矩形问题场景
定义Square类继承Rectangle类(即Square is-a Rectangle):
Rectangle类支持设置宽度w和高度hSquare类重写了设置方法,修改时会同时改变宽度和高度(例如Square.setWidth会将w和h设为同一值)
引入类方法squeeze,它将h改为h/2。若对Square调用该方法,会导致w≠h,违反Square自身的w==h不变量。
违反项分析
直观来看似乎违反了“子类型不得弱化不变量”的要求,但实际是子类型强化了不变量:父类Rectangle的原不变量仅为w,h >= 0,而Square新增了w==h的强不变量。
- 未违反“子类型不得弱化后置条件”:反而
Square强化了后置条件——任何操作后都需满足w==h,而Rectangle无此要求。 - 未涉及前置条件相关问题。
- 仅使用类方法,不涉及历史约束问题。
内容的提问来源于stack exchange,提问作者user2978125
相关产品推荐
相关产品推荐

