里氏替换原则LSP约束子类不能破坏父类逻辑

风辰吖_8414

风辰吖_8414

2026-04-06

563人浏览

原创

里氏替换原则要求子类对象能透明替换父类对象且不改变程序正确性,核心是守恒行为契约(输入输出、前置/后置条件、不变量),允许功能增强但禁止削弱语义或破坏调用方预期。

里氏替换原则lsp约束子类不能破坏父类逻辑

里氏替换原则(LSP)的核心不是“子类不能破坏父类逻辑”,而是子类对象必须能透明地替换父类对象,且不改变程序的正确性。关键在于行为契约的守恒——父类定义了什么行为,子类在继承后仍要满足同样的输入输出关系、前置条件、后置条件和不变量。

行为契约比代码逻辑更重要

父类方法的文档注释、参数约束、返回值语义、异常类型、线程安全性等,共同构成隐式或显式的行为契约。子类重写时若放宽前置条件(如允许 null 输入)、加强后置条件(如额外抛出异常)、改变可变状态的可见性,就可能违反 LSP。

  • 例如:父类 withdraw(double amount) 规定“金额必须大于 0”,子类却允许 0 或负数并静默忽略——调用方依赖非零校验的逻辑就会出错。
  • 又如:父类方法保证线程安全,子类去掉同步机制,外部并发调用结果不可预测。

子类可以扩展,但不能削弱

LSP 允许子类增强功能(如缓存、日志、更精确的异常),但不能缩小能力范围或改变原有语义。

  • 父类返回 List<string></string>,子类返回 ArrayList<string></string> 是安全的;但若子类返回空列表或抛出 UnsupportedOperationException 就违规。
  • 父类方法承诺“不修改入参对象”,子类却调用了 input.clear(),破坏了调用方对参数状态的预期。

测试是验证 LSP 的有效手段

为父类编写单元测试(尤其是边界和异常场景),然后用相同测试套件运行子类实例。若子类测试失败,大概率违反 LSP。

  • 测试应覆盖:正常流程、非法输入、空值、并发访问、状态变更前后的一致性。
  • 避免只测“能跑通”,而要测“行为是否等价”——比如父类抛 IllegalArgumentException,子类改抛 RuntimeException 就属于契约破坏。

真正遵守 LSP,靠的不是限制子类做什么,而是让设计者始终以“使用者视角”审视继承关系:当把子类传给只认识父类的代码时,它会不会悄悄做些父类从不做的事,或者拒绝做父类承诺过的事?

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

5399

3

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

2023.09.22

529

3

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

2024.03.01

1658

6

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

2023.09.22

529

3

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

2024.03.01

1658

6

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

2023.09.22

529

3

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

2024.03.01

1658

6

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

2025.08.29

3368

10

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

2025.10.23

624

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.4万人学习