子类新增方法是否违反里氏替换原则(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
相关产品推荐
相关产品推荐

