1. 里氏替换原则的本质理解
我第一次接触里氏替换原则是在重构一个电商订单系统时。当时系统里充斥着大量instanceof判断和类型转换,每次新增支付方式都要修改十几处条件分支。直到团队里的架构师老张在黑板上写下"子类必须能够替换父类"这几个字,我才真正明白这个原则的价值。
里氏替换原则(Liskov Substitution Principle, LSP)是面向对象设计的基石之一,由Barbara Liskov在1987年提出。简单来说就是:如果S是T的子类型,那么程序中T类型的对象可以被替换为S类型的对象,而不会改变程序的任何期望属性。
关键理解:这里的"替换"不是指语法层面的替换,而是行为模式的兼容性。就像USB接口规范,Type-C可以替换Type-A不是因为他们物理形状相同,而是因为数据传输协议保持兼容。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 原则的数学表达与编程体现
从数学角度看,LSP可以用契约式设计来表述。假设父类T的方法f满足前置条件Pre和和后置条件Post,那么子类S的方法f必须:
- 前置条件不能强于父类(可以更弱)
- 后置条件不能弱于父类(可以更强)
用Java代码示例说明:
java复制// 父类
class Rectangle {
protected int width;
protected int height;
public void setWidth(int w) {
this.width = w;
}
public void setHeight(int h) {
this.height = h;
}
}
// 违反LSP的子类
class Square extends Rectangle {
@Override
public void setWidth(int w) {
super.setWidth(w);
super.setHeight(w); // 改变了父类行为契约
}
@Override
public void setHeight(int h) {
super.setHeight(h);
super.se
