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

LSP与虚方法疑问:正方形继承矩形的方法设计困惑

里氏替换原则(LSP)中Square与Rectangle的困惑解答

是否针对可重写的虚方法

这个经典反例确实围绕可重写的虚方法展开。为了保证正方形的宽高始终一致,Square必须重写Rectangle的setWidth和setHeight方法——比如在setWidth里同步修改height,setHeight里同步修改width。当用基类Rectangle的引用指向Square实例时,调用这些虚方法会执行子类的重写逻辑,这就与基类预期的“宽高独立设置”行为产生冲突,直接违反LSP。

如果是非虚方法,子类无法重写,Square调用setWidth/setHeight只会执行基类逻辑,此时宽高会出现不一致,Square不再符合“正方形”的定义,本质是把Square变成了一个不符合自身语义的Rectangle,这同样是设计失败。

非虚方法下的规范层面问题

你判断得很准确:这种情况下代码看似能运行,但完全是设计规范层面的问题。Square作为正方形,核心语义是宽高始终相等,根本不应该暴露独立设置宽或高的方法——setWidth和setHeight的存在允许调用者做出违反正方形本质的操作(比如单独设置宽为5、高为3),这违背了类的职责与语义。

这种设计虽不会直接引发运行时错误,但会给调用者埋下逻辑隐患,导致代码维护成本剧增,同样不符合面向对象的设计原则。

本质总结

LSP的核心是子类必须严格遵守基类的行为契约。数学上的“is a”(正方形是矩形的特例)和面向对象中的“行为可替换”并非同一概念:矩形的行为契约包含“宽高可独立修改”,而正方形无法满足这一契约,因此二者不适合用继承建模。

内容的提问来源于stack exchange,提问作者nandu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 21:34:58