design-patterns - Liskov 替换原则 4 题
问题描述
我发现很难理解这个概念。我对此有几个问题。我试过在网上查,但那里没有太多关于它的资源。
子类是否需要在其整个生命周期中保持其独特性?
我很确定 LSP 定义了超类和子类之间的合同,如果我错了,请纠正我。
如果给定的函数使用了某个对象,你能用它的一个子类替换该对象而不破坏它的执行吗?
如果有一个类型是超类的变量,程序是否仍然有效。如果我将该超类或任何子类的实例放入该变量中。
如果这没有意义,我很抱歉。这 4 个问题困扰着我关于 LSP 的问题。
非常感谢
解决方案
LSP:如果S
是 的子类T
,那么 的每个实例S
都是 的实例T
。
就是这样,真的,但它有影响。
我不知道您所说的子类“保持其独特性”是什么意思。
LSP 确实暗示子类实例必须遵守超类契约,但它实际上是关于它在您使用时或在其他契约中的含义。S
T
例如,如果您编写一个Number add(Number a, Number b)
应该添加两个数字的函数,那么 LSP 会说这真正意味着它可以将 的任何实例添加Number
到 的任何其他实例Number
,并且包括任何子类的实例。LSP 说这个函数不可能是正确的,因为它无法知道每个实例对于Number
Integers、Floats、BigDecimals 等都是不正确的,因为这些都是Number
.
如果给定的函数使用了某个对象,你能用它的一个子类替换该对象而不破坏它的执行吗?
如果这是一个参数,而你不能,那么函数不正确,或者子类不正确。
如果有一个类型是超类的变量,程序是否仍然有效。如果我将该超类或任何子类的实例放入该变量
不必要。仅仅因为变量是 type Integer
,这并不意味着您可以625
任意设置它并期望程序继续工作。 625
就像Integer
每个S
都是T
推荐阅读
- javascript - 复制带有链接输入字段的列表
- vector - 2D 射线与 AABB 相交,代码生成太多相交
- python - 我无法在 Flask 上使用 SQLAlchemy 创建表
- reactjs - 当用户未通过身份验证时反应闪烁的私有路由
- javascript - 将 JS 链接到 Google 应用程序脚本以运行基于 Web 应用程序上的复选框的功能
- python - AttributeError:“列表”对象在发送电子邮件时没有属性“编码”
- bash - 如何在bash中查找列值并替换
- pyspark - PYSPARK:查找不包括前 1 个百分位数据的变量的平均值
- amazon-web-services - AWS Amplify 在创建 DynamoDB 表后创建全局二级索引
- python - 如何从具有多行的文本文件创建整数列表?