我终于搞懂了里氏替换原则
来源:dev.to — 2026-10-26
📋 概述
SOLID 讲到 L,作者说这是第一个真的会让人栽跟头的原则,而他自己在生产里发过那个 bug,还不止一次。他把 1987 年那段像数学论文的定义翻译成一句人话:父类能用的地方,任何子类都必须也能用,不能有惊喜,不能加 instanceof 判断。例子不用正方形和矩形,改用支付与退款:几种支付方式各自能扣款和退款,调用方从不关心拿到哪一种。后来加了礼品卡,能扣款,但法务说不能退现金,于是子类里写了 throw new Error('not supported')。TypeScript 编译通过,PR 被合了。三周后产品召回,客服跑批量退款脚本,A2 抛异常,A3 干脆没被处理,用户直接写了一星差评。
🔑 核心要点
- 里氏替换的要点是父类能用的地方子类必须也能用,调用方不该做类型判断
- 子类在运行时抛「不支持」就是违约,而编译期完全看不出问题
- 常见补药用 instanceof 特判子类,结果是基类被一点点掏空
- 正确做法是把退款能力从支付能力里拆出去,让类型系统替你检查
- 一句话记住:子类可以比父类做得多,绝不能做得少
💡 金句
“If you remember one sentence: a subclass may do more than its parent, never less.”
译:如果只记一句话:子类可以比父类做得多,绝不能做得少。
← 返回 dev.to 首页