用不同的方式解释同一个事情,会理解的更深刻。

文章目录

  • 表述 1:1987 ~ 1988 年,来自 Barbara Liskov
  • 表述 2:1994 年,来自 Barbara Liskov
  • 表述 3:1996 年,来自 Robert Martin (Bob 大叔)
  • 表述 4:2000 年,来自 Barbara Liskov
  • 表述 5:2002 年,来自 Bob 大叔
  • 表述 6:2009 年,来自 Barbara Liskov
  • 表述 7:2016 年,来自 THEODORE S. NORVELL
  • 延伸阅读

注1: 本文中,所有 supertype 或者 superclass 都翻译为「父类」,有人也将此翻译为「超类」或「超类型」。
父类的父类,仍然翻译为 父类,区别是直接父类和间接父类。如果在表述上有歧义,会加上说明。一般情况下,按照上下文来理解。

注2: 本文中不对 supertype(subtype) 和 superclass(subclass) 进行区分。关于这两者的区别,参考 《subtype,supertype 与 subclass,superclass 的异同》

LSP 适用于面向对象编程语言,不只是 C++ 和 Java, LSP 提出的时候,Java 还没有诞生。LSP 最早的表述,也并不针对某一个特定的 OOP 语言,是对 OOP 语言特性更抽象、更通用的表述。

表述 1:1987 ~ 1988 年,来自 Barbara Liskov

时间: 1987 年 10 月 发表在 OOPSLA 大会
1988 年 5 月 发表在 ACM SIGPLAN Notices 月刊

出处: 《Data abstraction and hierarchy 论文》
论文作者: Barbara Liskov

下载地址: 《Data Abstraction and Hierarchy》论文的 下载地址1,下载地址2,下载地址3 。

表述: If for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T, the behavior of P is unchanged when o1 is substituted for o2, then S is a subtype of T.

翻译: 如果对于 SSS 类型的每个对象 o1o_1o1​,都有一个 TTT 类型的对象 o2o_2o2​,使得对于根据 TTT 定义的所有程序 PPP,当 o1o_1o1​ 替换 o2o_2o2​ 时,PPP 的行为保持不变,则 SSS 是 TTT 的子类型。

原文截图:

参考:

  • Keynote address - data abstraction and hierarchy (OOPSLA 1987)
  • Keynote address - data abstraction and hierarchy (ACM SIGPLAN Notices May 1988)

表述 2:1994 年,来自 Barbara Liskov

时间: 1994 年 11 月

出处: 《A Behavioral Notion of Subtyping》
论文作者:BARBARA H. LISKOV 和 JEAN NETTE M. WING

下载地址: 《A Behavioral Notion of Subtyping》论文的 下载地址1 , 下载地址2

表述: the objects of the subtype ought to behave the same as those of the supertype as far as anyone or any program using supertype objects can tell.

An assignment
x:T:=Ex: T:=Ex:T:=E
is legal provided the type of expression E is a subtype of the declared type T of variable x.
Once the assignment has occurred, x will be used according to its “apparent” type T,
with the expectation that if the program performs correctly when the actual type of x’s object is T,
it will also work correctly if the actual type of the object denoted by x is a subtype of T.

翻译: 任何使用父类对象的程序,(在用子类对象作为父类对象时)子类的对象应该与父类对象的行为一样。
例如,赋值语句 x:T:=Ex: T:=Ex:T:=E,xxx 是变量(对象),xxx 的类型是 TTT,EEE 是表达式,
表达式 EEE 的值是 TTT 的子类时,表达式 x:T:=Ex: T:=Ex:T:=E 是合法的。xxx 会被当做 TTT 类对象来使用。
如果 xxx 对象的实际类型是 TTT 时,程序可以正确执行;那么,如果 xxx 对象的实际类型是 TTT 的子类时,程序也可以正确执行。

原文截图:

参考: A behavioral notion of subtyping

表述 3:1996 年,来自 Robert Martin (Bob 大叔)

时间: 1996 年

出处: Bob 大叔(Robert Martin)写的文章《The Liskov Substitution Principle》

下载地址: 《The Liskov Substitution Principle》的 下载地址1,下载地址2,下载地址3

表述: FUNCTIONS THAT USE POINTERS OR REFERENCES TO BASE CLASSES MUST BE ABLE TO USE OBJECTS OF DERIVED CLASSES WITHOUT KNOWING IT.

翻译: 使用指向基类的指针(或引用)的函数,必须能够使用派生类的对象,而不用对派生类有所了解。
子类的对象传给函数的时候,函数不需要了解子类的细节。

(注1:Bob 大叔对 LSP 的解读,是从 C++ 语言出发的,这样对于 C++ 开发者更容易理解,所以 LSP 的表述中出现了「函数」、「指针」。
Bob 大叔 1996 年写《The Liskov Substitution Principle》,Java 语言(1995 年)刚诞生一年。)

(注2:不知道是不是 Bob 大叔第一次把 Liskov 加到了 Substitution Principle 的前面,对于 Liskov 本人来说,即使提出「替换原则」10 多年了,在 2000 年自己的书中,也不会说这是「The Liskov Substitution Principle」,而只说「Substitution Principle」,到 2009 年的 《The Power of Abstraction》讲义 第 50 页,Barbara Liskov 教授使用了「The Liskov Substitution Principle」。)

原文截图:

参考:
The Liskov Substitution Principle

表述 4:2000 年,来自 Barbara Liskov

时间: 2000 年 5 月

出处: 《Program Development in Java: Abstraction, Specification, and Object-Oriented Design》一书
作者 Barbara Liskov 和 John Guttag

下载地址: www.pdfdrive.com 上有电子版,自行搜索

表述: In particular, supertype’s behavior must be supported by the subtypes: subtype objects can be substituted for supertype objects without affecting the behavior of the using code.
For example, code can be written in terms of the Reader type, yet work correctly when using a BufferedReader.

翻译: 父类型的行为必须被子类型支持:子类型的对象可以替换掉父类型的对象,而不会影响到代码的行为。例如,用 Reader 类写的代码,在使用 BufferedReader 的对象时,仍然能够正确运行。

(注:书名「Program Development in Java」,Barbara Liskov 将「替换原则」用到了 Java 语言上。)

原文截图:

参考:
Program Development in Java: Abstraction, Specification, and Object-Oriented Design (www.amazon.com)

表述 5:2002 年,来自 Bob 大叔

时间: 2002 年 10 月 15 日 (书的第一版出版时间)

出处: 《Agile Software Development, Principles, Patterns, and Practices》一书
作者:Robert C Martin

下载地址: www.pdfdrive.com 上有电子版,自行搜索

表述: SUBTYPES MUST BE SUBSTITUTABLE FOR THEIR BASE TYPES.

翻译: 子类型必须可以替换掉他们的基类型。

(在实际编码中,子类型的对象可以作为父类对象来使用)

原文截图:

参考:
Agile Software Development, Principles, Patterns, and Practices (on Amazon.com)

表述 6:2009 年,来自 Barbara Liskov

时间: 2009 年 11 月

出处: 《The Power of Abstraction》讲义
作者:Barbara Liskov

下载地址: 《The Power of Abstraction》讲义的 下载地址

表述: Objects of subtypes should behave like those of supertypes if used via supertype methods

翻译: 子类型的对象,如果通过父类型的方式使用,应该和父类型的对象的行为一致。

(类似于这样: 父类 obj = 子类对象

原文截图:

参考:
Barbara Liskov 主页: https://pmg.csail.mit.edu/~liskov/
主页中的 Power of Abstraction Slides [ ppt | pdf ]

表述 7:2016 年,来自 THEODORE S. NORVELL

时间: 2016 年 3 月 11 日

出处: THEODORE S. NORVELL 的课程讲义 《Software Design (Engi-5895) 2016》,更新于 2016 年 3 月 11 日,讲义最早是2007 年写的。

下载地址: 《Software Design (Engi-5895) 2016》中,关于 LSP 的 讲义:Agile Design Principles: The Liskov Substitution Principle (pdf)

表述: If S is a declared subtype of T, objects of type S should behave as objects of type T are expected to behave, if they are treated as objects of type T
Note that the LSP is all about expected behaviour of objects. One can only follow the LSP if one is clear about what the expected behaviour of objects is.

翻译: 如果 S 是 T 的子类型,当 S 类型的对象被当做 T 类型的对象时,S 类型的对象的行为应该和 T 类型的对象的行为一致。
LSP 完全是关于对象的预期行为,只有清晰地知道对象的预期行为是什么,才能做到遵循 LSP。

关于 If S is a declared subtype of T,作者的解释是这样的:
对 Java 来说,满足以下条件之一,S 是 T 的声明子类型:

  • S 就是 T
  • S implements T,或者 S extends T
  • S implements 或者 extends 某个类,这个类 implements 或者 extends T,以此类推。

原文截图:

参考:

  • https://www.engr.mun.ca/~theo/Courses/sd/notes.html
    The Liskov Substitution Principle (LSP)[Updated Mar 11.]
  • https://www.engr.mun.ca/~theo/Contact/index.html

延伸阅读

里氏替换原则是哪一年发表的?

【LSP简史】里氏替换原则表述方式的变化,从学术到「人话」相关推荐

  1. 面向对象设计原则之三:里氏替换原则

    里氏替换原则(Liskov Substitution Principle LSP)   里氏替换原则是面向对象设计的基本原则之一.任何基类可以出现的地方,子类一定可以出现.LSP是继承复用的基石,只有 ...

  2. 设计模式(二)--里氏替换原则(Java的继承规范)

    昨天有说到单一职责原则是针对接口的思维拓展,有没看过的,可以看看!https://blog.csdn.net/newlifemain/article/details/100184642 今天我们来看看 ...

  3. 深入理解JavaScript系列(8):S.O.L.I.D五大原则之里氏替换原则LSP

    前言 本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第3篇,里氏替换原则LSP(The Liskov Substitution Principle ). 英文原文:http ...

  4. 【转】深入理解JavaScript系列(8):S.O.L.I.D五大原则之里氏替换原则LSP

    前言 本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第3篇,里氏替换原则LSP(The Liskov Substitution Principle ). 英文原文:http ...

  5. 设计模式|LSP(里氏替换)原则

    软件质量保障 专注测试圈,自动化测试.测试平台开发.测试新技术.大厂测试岗面经分享, 可以帮忙内推BATJ等大厂!欢迎加VX沟通交流: ISTE1024 在面向对象的语言中,继承是非常优秀的语言机制, ...

  6. 设计模式之七大原则——里氏替换原则(LSP)(三)

    里氏替换原则(Liskov Substitution Principel)是解决继承带来的问题. 4 里氏代换原则(Liskov Substitution Principle, LSP) 4.1 什么 ...

  7. 里氏替换原则(Liskov Substitution Principle,LSP)

    昨天图文介绍了软件设计的一个基本原则"开闭原则",而"开闭原则"的核心就是通过抽象把需求变化进行隔离,这种想法可以通过"里氏替换原则"进行保 ...

  8. java solid设计原则_六大设计原则之里氏替换原则(LSP)

    一.SOLID 设计模式的六大原则有: Single Responsibility Principle:单一职责原则 Open Closed Principle:开闭原则 Liskov Substit ...

  9. LSP (里氏代换原则)

    LSP (里氏代换原则) 编辑 本词条缺少 名片图,补充相关内容使词条更完整,还能快速升级,赶紧来 编辑吧! LSP是里氏代换原则的英文Liskov Substitution Principle的缩写 ...

最新文章

  1. Dicom Test Files
  2. java中的后台线程、前台线程、守护线程区别
  3. [Lintcode]136. Palindrome Partitioning /[Leetcode]131. Palindrome Partitioning
  4. vue watch 第一次不执行_Vue 实现前进刷新,后退不刷新的效果
  5. [渲染层错误] multipolyline.styles: 样式id_【译】关于 SPA,你需要掌握的 4 层
  6. Unity中的单例方法
  7. 专家教你如何设置无线路由器 享受无线乐趣
  8. java亚马逊模拟登录_java – 亚马逊MWS入门
  9. Android路由设置
  10. 路由器交换机防火墙无线AP基础理论知识总结
  11. ObjectiveC开发教程--如何判断字符串是否为空的方法
  12. 为什么要学习Go语言?
  13. java全能速查宝典_MATLAB函数全能速查宝典 邓薇等 编著.pdf
  14. 砸金蛋c语言编程,CSS3 简单的砸金蛋样式
  15. 什么是python语言的解释性?
  16. Linux下压缩与解压缩
  17. 大一计算机试题答案,大一计算机期末考试试题及答案
  18. 如何生成数据库设计文档
  19. 2023年批量下载和改名音频专辑(多页列表)
  20. 市场调研—全球与中国手推式扫地机市场现状及未来发展趋势

热门文章

  1. Android异步消息处理机制之looper机制
  2. 【react】This synthetic event is reused for performance reasons.
  3. ios11非越狱如何安装ipa
  4. php ws聊天,php+websocket实现在线聊天室
  5. libreCAD源码阅读笔记4
  6. Vdbench存储测试教程
  7. 聊聊技术专家谈阿里云史诗级故障
  8. 机器学习回归预测_通过机器学习回归预测高中生成绩
  9. 计算机硬件英语文章带翻译,适合孩子阅读的英语小短文(带翻译)
  10. powerdesigner 16.5 破解步骤