首页/开发/代码质量与评审速查/里氏替换原则 LSP(Liskov Substitution Principle)
设计原则与模式62 条

里氏替换原则 LSP(Liskov Substitution Principle)

子类型必须能替换其基类型而不破坏程序正确性(Liskov 与 Wing 的表述):子类不收紧前置条件、不放松后置条件,调用方对基类成立的推理对子类同样成立。

提出Barbara Liskov(1987 主题演讲;1994 形式化论文)
契约规则前置条件不加强、后置条件不削弱、不变量保持
反例正方形继承矩形:setWidth 语义被破坏

契约违背示例

契约违背示例
// 矩形:setWidth 后 setHeight 不受影响
// 正方形:setWidth 会同时改 height —— 调用方断言被破坏
Rect r = new Square();
r.setWidth(5); r.setHeight(4);
assert r.area() == 20;   // Square 下不成立
LSP 是行为子类型而非语法子类型:能编译通过不代表能安全替换。

易错点

  • 子类覆写后抛未支持异常:调用方契约被截断
  • 子类悄悄收紧参数校验:替换后在边缘输入崩溃

数据来源与参考

  • Barbara Liskov 与 Jeannette Wing《A Behavioral Notion of Subtyping》(1994)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌