| 契约规则 | 子类可放宽前置条件、可加强后置保证,不可反向 |
|---|---|
| 识别方法 | 看调用方是否需要用类型判断或特殊分支才能正确工作 |
| 后果 | 违反 LSP 的继承会导致使用方出现隐式类型判断 |
违反与修复示例
违反与修复示例
// 违反:子类改变父类语义
class 矩形 { setW(w); setH(h) }
class 正方形 extends 矩形 { setW 同时改高 }
// 调用方基于矩形的行为假设被破坏
// 修复:改为不可变值对象与工厂方法,取消继承关系行为契约比签名重要:方法签名兼容但语义不同(如子类方法抛出新异常)同样违反 LSP。