首页/开发/系统分析与架构设计速查/里氏替换原则(LSP)
架构风格与模式58 条

里氏替换原则(LSP)

子类型必须能替换父类型而不破坏调用方依赖的行为契约:前置条件不加强、后置条件不减弱、不变量保持;典型违反是正方形继承矩形。

契约规则子类可放宽前置条件、可加强后置保证,不可反向
识别方法看调用方是否需要用类型判断或特殊分支才能正确工作
后果违反 LSP 的继承会导致使用方出现隐式类型判断

违反与修复示例

违反与修复示例
// 违反:子类改变父类语义
class 矩形 { setW(w); setH(h) }
class 正方形 extends 矩形 { setW 同时改高 }
// 调用方基于矩形的行为假设被破坏

// 修复:改为不可变值对象与工厂方法,取消继承关系
行为契约比签名重要:方法签名兼容但语义不同(如子类方法抛出新异常)同样违反 LSP。

易错点

  • 用 instanceof 分支处理不同子类,说明继承层级设计有问题
  • 子类重写方法抛出父类未声明的异常,调用方处理逻辑失效

数据来源与参考

  • Barbara Liskov & Jeannette Wing《A Behavioral Notion of Subtyping》(1994)
  • Robert C. Martin《Clean Architecture》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌