诸神缄默不语-个人CSDN博文目录
里氏替换原则(Liskov Substitution Principle,LSP)是面向对象设计的基本原则之一。
文章目录
- 一、概念定义
- 二、违反里氏替换原则的常见情况及示例
- 三、遵循里氏替换原则的好处
一、概念定义
- 基本表述
- 子类型必须能够替换掉它们的基类型。也就是说,在程序中,任何基类可以出现的地方,子类一定可以出现,并且程序的行为不会被破坏。
- 从继承关系角度理解
- 当一个类继承自另一个类时,子类应该完全兼容父类的行为。例如,在一个使用父类引用的场景中,如果将父类引用替换为子类引用后,整个程序的功能逻辑依然正确。
二、违反里氏替换原则的常见情况及示例
- 方法签名改变
- 比如父类有一个方法
public int calculate(int a, int b)
,子类将其改为public double calculate(double a, double b)
。这样在使用父类引用调用该方法的地方就会出现类型不匹配的问题。
- 比如父类有一个方法
- 方法行为改变
- 假设父类的
withdraw
方法在账户余额不足时只是简单返回一个错误码,而子类重写后的withdraw
方法在余额不足时会抛出异常。如果程序的其他部分是基于父类的行为逻辑编写的,在使用子类替换父类后就可能导致程序出错。
- 假设父类的
三、遵循里氏替换原则的好处
- 提高代码的可维护性
- 当需要扩展系统功能时,可以在不修改现有代码的基础上通过继承添加新的子类。因为子类与父类的兼容性保证了替换后的程序依然能正常工作。
- 增强代码的可扩展性
- 方便在不破坏现有架构的情况下增加新的类型层次结构。例如在设计图形绘制系统时,基类
Shape
有draw
方法,各种具体的形状类(如Circle
、Rectangle
等)作为子类遵循里氏替换原则,就可以很容易地扩展新的形状类到系统中。
- 方便在不破坏现有架构的情况下增加新的类型层次结构。例如在设计图形绘制系统时,基类
- 促进软件设计的合理性
- 引导开发者正确地设计类的继承关系,避免过度耦合和不合理的继承结构。使得整个软件系统的架构更加清晰、稳定。