如何考虑子类型的多态性

2024-05-21

里氏替换原则指出:

超类型的不变量必须保留在子类型中。

我对这个原理和多态性的交叉特别感兴趣。事实上,特别是子类型多态性,参数多态性和 Haskell 类型类似乎就是这种情况。

因此,我知道当函数的参数是逆变且返回类型是协变时,函数是子类型。我们可以假设方法只是带有隐式“self”参数的函数。然而,这似乎意味着,如果子类重写父类的方法,它就不再是子类型,因为它的方法之一不再是子类型。

例如。采取以下伪代码:

class Parent:
    count : int
    increment : Parent -> ()
    {
        count += 1
    }

class Child inherits Parent:
    increment : Child -> ()
    {
        count += 2
    }

那么回到 LSP:我们可以说Parent.increment()应该坚持Child.increment()即使这两者不遵守严格的子类型关系?

更一般地说,我的问题是:子类型化规则如何与多态函数的更具体参数相结合,以及一起思考这两个概念的正确方法是什么?


引用维基百科的文章里氏替换原则 http://en.wikipedia.org/wiki/Liskov_substitution_principle

更正式地说,里氏替换原则(LSP)是一个特定的 子类型关系的定义,称为(强)行为的 子类型化 [...]

行为亚型是比典型的子类型更强的概念 类型论中定义的函数,它仅依赖于 参数类型的逆变和返回类型的协变。 一般来说,行为子类型是无法确定的 [...]

该亚型必须满足许多行为条件 见面:

  • 无法在子类型中强化先决条件。
  • 子类型中的后置条件不能被削弱。
  • 超类型的不变量必须保留在子类型中。

因此,LSP 是子类型的一个更强的定义,它依赖于类型理论之外的特征。

在你的例子中,它的上升和下降取决于你的不变量。

calling increment will increase count by **exactly 1**

明显地Child不能用以下方式表达Parent因为不变量被打破了。这不能仅从语法推断出来。

LSP 应该引导您分别定义 Parent 和 Child,让它们都继承自Incrementable其后置条件较弱。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何考虑子类型的多态性 的相关文章

随机推荐

  • Google 电子表格中带有 len 的 Countif

    我有一个像这样的 XXX 列 XXX A Aruin Avolyn B Batracia Buna 我想仅当单元格中的字符串长度 gt 1 时才对单元格进行计数 怎么做 我想 COUNTIF XXX1 XXX30 LEN gt 1 但我应该
  • 在 C++11 中移出 stdpriority_queue 的元素

    最小的工作示例 include
  • 如何更改 Android 12 启动屏幕中的图标形状?

    我想要矩形形状的启动屏幕图标 而不是 android 12 中的圆形形状 我不相信你可以 如果你看这里的第 3 点 https developer android com about versions 12 features splash
  • 为什么 gmail API 以纯文本形式发送 html 电子邮件?

    我正在尝试使用 gmail API 发送 html 电子邮件 但由于某些原因 它会随机以纯文本 文本形式发送电子邮件 谷歌似乎改变了我设置的内容类型标头 这有什么理由吗 电子邮件内容始终完全相同 正如我测试的那样 API 仍处于实验阶段吗
  • 在vscode中使用reactjs报错

    在 Visual Studio 代码中使用 jsx 语法 Visual Studio代码报错 请帮我 谢谢 符号 例如 而不是这样做 return lt button className square gt TODO lt button g
  • 使用Python计算目录的大小?

    在我重新发明这个特殊的轮子之前 有没有人有一个很好的例程来使用 Python 计算目录的大小 如果例程能够很好地以 Mb Gb 等格式格式化大小 那就太好了 这会遍历所有子目录 总结文件大小 import os def get size s
  • 如何使用 Roslyn 通过扩展方法、静态类中的方法以及带有 ref/out 参数的方法来访问调用

    我正在致力于创建一个开源项目 用于创建 NET UML 序列图 该项目利用名为 js sequence diagrams 的 javascript 库 我不确定 Roslyn 是适合这项工作的工具 但我想我应该尝试一下 所以我整理了一些概念
  • 在 android 中,第一次单击时按钮侦听器未注册

    因为我是 Android 新手 所以我遇到了按钮监听器的问题 我正在使用 OnClickListener 来处理胸像 但它第一次点击后不执行一旦我单击多个 它就会表现良好 但如何使其在第一次单击时成为可能 这是我的代码 public cla
  • 如何在win32中使用GetSaveFileName保存文件?

    我编写此代码是为了获取 fileName 来保存我的文件 include stdafx h include
  • 使用后退按钮启动 Activity

    我正在 Android 中开发一个应用程序 我正在寻找解决方案 有一个活动 例如 A1 通过单击按钮 用户可以转到另一个活动 例如 A2 现在 一旦用户完成 A2 活动 他就会单击后退按钮 返回到上一个活动 A1 这是众所周知的事实 A1此
  • SQL Server默认字符编码

    默认情况下 Microsoft SQL Server 中数据库的字符编码集是什么 如何查看 SQL Server 中当前的字符编码 编码 In most cases SQL Server stores Unicode data i e th
  • 无法登录 Google Play 游戏服务

    我在开发者控制台上使用包名称和正确的签名证书设置了我的游戏 并为其创建了排行榜 但没有创建任何成就 然后 我从以下位置下载了示例 Type A Number Challenge 和 BaseGameUtils https developer
  • 在 C# 中何时使用 ArrayList 而不是 array[]?

    我经常使用一个ArrayList而不是 正常 array 当我使用时 我感觉好像我在作弊 或懒惰 ArrayList 什么时候可以使用ArrayList在数组上 数组是强类型的 并且可以很好地用作参数 如果您知道集合的长度并且它是固定的 则
  • BitmapFactory.decodeResource() 忽略 jpg 图像的 inPreferredConfig 选项

    我尝试将jpeg资源图像加载到ARGB 8888格式的位图 BitmapFactory Options opts new BitmapFactory Options opts inPreferredConfig Bitmap Config
  • 使用 YUI 创建 HTML 元素

    我正在使用以下代码使用 YUI 在页面主体中创建 html 元素 这段代码不会产生任何错误 问题是 段落元素未在 html 页面中创建
  • 在 LINQ 中执行 FirstOrDefault 的替代方法

    我有一个成员资格表 用于记录用户是否是列表的成员 当用户的成员资格发生更新时 会写入新记录 并且先前的记录保持原样 从而可以维护其成员资格的历史记录 要获取用户的会员身份 需要选择他们最近的条目 下面是一些用户列表成员资格数据的示例 目的是
  • Geodjango距离查询未检索到正确的结果

    我正在尝试根据地理位置的接近程度来检索一些帖子 正如您在代码中看到的 我正在使用 GeoDjango 并且代码在视图中执行 问题是距离过滤器似乎被完全忽略了 当我检查查询集上的距离时 我得到了预期距离 1m 和 18km 但 18km 的帖
  • MonoDroid 和 MonoTouch 中的可移植类库程序集引用问题

    当我尝试构建引用 PCL 的 MonoDroid 或 MonoTouch 项目时 我的项目遇到问题 其中有适用于 Net 4 5 Windows Phone 8 WinRT MonoTouch 和 MonoDroid 的 PCL 如下所示
  • 如何在 Perl 脚本中加密或隐藏密码?

    我正在研究 Perl 脚本 它使用Expect http search cpan org dist Expect通过 telnet 登录到远程计算机 不要问 必须使用 telnet 我还根据需要执行 perforce p4 登录操作 并使用
  • 如何考虑子类型的多态性

    里氏替换原则指出 超类型的不变量必须保留在子类型中 我对这个原理和多态性的交叉特别感兴趣 事实上 特别是子类型多态性 参数多态性和 Haskell 类型类似乎就是这种情况 因此 我知道当函数的参数是逆变且返回类型是协变时 函数是子类型 我们