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

子类新增方法是否违反里氏替换原则(LSP)?以矩形正方形为例

关于里氏替换原则(LSP)的疑问解答

1. 子类新增专属方法是否违反LSP?

不会。里氏替换原则的核心要求是子类必须能替换父类,且替换后程序的行为符合父类的契约预期。子类新增专属方法只是扩展自身功能,并未修改或破坏父类已有的行为约定——父类的方法依然能按原有逻辑执行,因此不会违反LSP。

2. 你的示例代码是否违反LSP?

违反,但问题不在于HelloSquare这个新增方法,而是Square类对Width和Height属性的重写逻辑破坏了父类Rectangle的契约。

具体原因:

父类Rectangle的契约隐含以下规则:

  • 设置Width仅修改宽度属性,不影响高度
  • 设置Height仅修改高度属性,不影响宽度

但Square类重写这两个属性的setter后,设置其中一个属性会同时修改另一个,完全打破了父类的行为预期。比如执行以下代码:

Rectangle rect = new Square();
rect.Width = 5;
Console.WriteLine(rect.Height); // 输出5,而非父类预期的初始值
rect.Height = 10;
Console.WriteLine(rect.Width); // 输出10,而非之前设置的5

当用父类Rectangle的引用指向Square对象时,程序行为与父类契约不符,这直接违反了里氏替换原则。

而HelloSquare作为子类专属方法本身没有问题——只要不通过父类调用该方法(父类也无法调用),就不会影响LSP的遵循。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 20:35:23