You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何正方形-矩形问题会违反里氏替换原则(LSP)?

里氏替换原则(LSP)与正方形-矩形问题的违反分析

LSP对子类型的四项行为要求

  • 子类型不得强化前置条件
  • 子类型不得弱化后置条件
  • 子类型不得弱化不变量
  • 历史约束(“历史规则”):对象仅可通过其方法修改自身状态

正方形-矩形问题场景

定义Square类继承Rectangle类(即Square is-a Rectangle):

  • Rectangle类支持设置宽度w和高度h
  • Square类重写了设置方法,修改时会同时改变宽度和高度(例如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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 22:44:57