里氏替换原理、前提条件和抽象方法

2023-12-23

里氏替换原理(LSP)说:

无法在子类型中强化先决条件。

在 C# 中,我可能会违反整个原则,如下所示:

public class A 
{
      public virtual void DoStuff(string text)
      {
            Contract.Requires(!string.IsNullOrEmpty(text));
      }
}

public class B : A
{
      public override void DoStuff(string text)
      {
            Contract.Requires(!string.IsNullOrEmpty(text) && text.Length > 10);
      }
}

但是,如果A.DoStuff将是一个abstract method:

public class A 
{
      public abstract void DoStuff(string text);
}

public class B : A
{
      public override void DoStuff(string text)
      {
            Contract.Requires(!string.IsNullOrEmpty(text));
      }
}

Now A.DoStuff is 无合约的。或者它的合同只是一切都允许.

So, is B.DoStuff违反先决条件里氏替换原则?


这取决于合同的定义是什么.

LSP 是一个理论构造,它不依赖于特定的语言或实现,例如 C# 的“代码契约”功能。

合约可以定义为:

  • 方法名称
  • 方法参数名称
  • 方法注释
  • 返回类型和方法参数类型
  • “显式”合同,例如Contract.Requires

最后两项将由编译器验证。但是,前三个也可以成为合同的一部分!考虑以下示例:

public interface StuffContainer
{
    void Add(string text);

    // Removes a string that has previously been added.
    void Remove(string text);
}

名称和文件Remove方法定义了明确的前提条件。在实现中验证之前已添加的要删除的字符串不会违反 LSP。验证字符串是否至少有 5 个字符将违反 LSP。

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

里氏替换原理、前提条件和抽象方法 的相关文章

  • 如何将 std::string& 转换为 C# 引用字符串

    我正在尝试将 C 函数转换为std string参考C 我的 API 如下所示 void GetStringDemo std string str 理想情况下 我希望在 C 中看到类似的东西 void GetStringDemoWrap r
  • BASIC 中的 C 语言中的 PeekInt、PokeInt、Peek、Poke 等效项

    我想知道该命令的等效项是什么Peek and Poke 基本和其他变体 用 C 语言 类似PeekInt PokeInt 整数 涉及内存条的东西 我知道在 C 语言中有很多方法可以做到这一点 我正在尝试将基本程序移植到 C 语言 这只是使用
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • 如何定义一个可结构化绑定的对象的概念?

    我想定义一个concept可以检测类型是否T can be 结构化绑定 or not template
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • 如何更新 Python Pandas DataFrame 中特定行的值?

    借助 Pandas 中良好的索引方法 我可以毫无问题地以各种方式提取数据 另一方面 我仍然对如何更改现有 DataFrame 中的数据感到困惑 在下面的代码中 我有两个 DataFrame 我的目标是根据第二个 df 的值更新第一个 df
  • 为什么我的 COM 工厂在程序生命周期内从未被释放?

    我有一个本机 C ATL 进程内 COM 服务器 单独的测试程序 calls CoInitialize calls CoCreateInstance then calls Release 在指针上 然后打电话CoUnitialize 并退出
  • 检查移动网络可用的正确方法是什么(无数据连接)

    检查 Android 上移动网络 GSM 连接是否可用的正确方法是什么 gt 2 1 我不想检查移动网络是否有可用的数据连接 只需检查一般网络可用性 检查是否可以通过移动网络拨打电话 目前我正在使用以下检查 public static bo
  • 如何读取Spring XML配置中的application.yml?

    在我的项目中 我使用基于 XML 的配置 并且我正在尝试读取 application yml 文件 应用程序 yml vtp config priority 2 country US countryFriend UK AG 3 countr
  • 如何指定在 Netbeans 中使用哪个 JRE?

    我的系统中有两个 JRE 一种是 32 位 另一种是 64 位 在 Eclipse 中 我可以配置两者并在运行应用程序时选择使用哪一个 我想知道我是否可以在 Netbeans 中做同样的事情 我尝试转到 项目属性 库 然后尝试通过 管理平台
  • Asset Pipeline 预编译所有 asset 文件夹子目录

    我喜欢让我的资产高度组织起来 但是 我遇到了预编译问题 它没有选取子目录 以下是路径 assets gt fonts gt images gt gt backgrounds gt gt home gt gt icons 开发上一切正常 但生
  • node.js ejs包含错误

    我正在创建这个模板
  • libc++ 和 libstdc++ 之间的 istream eof 差异

    当链接到 libstdc 和 libc 时 以下 玩具 程序返回不同的内容 这是 libc 中的错误还是我不明白 istream eof 的工作原理 我尝试在 linux 和 mac os x 上使用 g 运行它 在 mac os x 上使
  • 如何向后移植 Qt 中的功能?

    假设有一个使用 Qt 的项目 并且依赖于 Qt 新版本中存在的功能 例如添加的类成员 该项目旨在使用 Qt 的 系统 发行版本进行构建 该版本可能比项目所依赖的版本更旧 幼稚的方法会导致预处理器地狱 void Class foo if QT
  • 如何在Dynamics CRM 2011中获取相关实体

    我们目前正在最近发布的 Dynamics CRM 2011 中开发 Silverlight Web 资源 此时我们希望实现一个自动完成框 显示帐户集合及其地址 我们目前陷入了从账户实体到地址实体所需遵循的关系 目前我刚刚毕业 任何帮助将不胜
  • 在 Python 2.5 中将 Google App Engine blobstore 作为文件写入的正确方法是什么

    当我尝试对 Google App Engine blobstore 进行简单写入时 当前超出了软内存限制 编写此代码以使其不会泄漏内存的正确方法是什么 from future import with statement from googl
  • Laravel 与 mssql (sqlsrv) 未连接

    我正在用 mysql 开发 laravel 它工作得很好 但我现在有另一种情况 我需要将 laravel 连接到驻留在 Windows 服务器上的 ms sql 数据库 我使用以下代码连接到数据库 app config database p
  • 如何将变量添加到我的 re.compile 表达式中

    所以我试图在文件中查找由变量表示的关键字what2look4 然而 每当我运行这个程序时 它总是返回空白数据 代码如下 regex2 re compile what2look4 我相信问题是正在搜索该文件what2look4作为字符串本身而
  • std::basic_string 专业化

    我只需要覆盖 std basic string 中的 length 函数 因为它对于特定平台上的自定义字符类型不正确 这是 CustomString 的当前声明 typedef STL basic string
  • 与 API 交互时标头键变为小写 - React Native

    与 API 交互时 自定义 Header key 始终变为小写 我用的是Fetch Axios XMLHttpRequest and Frisbee javascript网络库 但密钥始终小写 我的代码片段是这样的 带有fetch 方法 我
  • 抑制 OCaml 中的详尽匹配警告

    我在修复 OCaml 编译器向我发出的警告时遇到问题 基本上我正在解析一个可以由以下内容组成的表达式Bool Int and Float 我有一个符号表 用于跟踪用其类型声明的所有符号 type ast type Bool Int Floa
  • 如何在Wildfly中设置两只耳朵的部署顺序

    我对 Wildfly 8 1 中两个应用程序的部署顺序有一些问题 问题是某些模块app2 ear依赖于模块app1 ear but app1 ear部署后app2 ear 我尝试为 app1 指定一个依赖项 如下所示
  • 如何在 ruby​​ 中对哈希数组进行排序

    我有一个数组 其中每个元素都是具有三个键 值对的哈希 phone gt 2130001111 zip gt 12345 city gt sometown 我想对数据进行排序zip所以所有的phone同一区域的人在一起 Ruby 有简单的方法
  • 如何有效地过滤对象中的对象?

    这个问题在SO中已经被提出过很多次了 但是他们都提到了对象数组 就我而言 我想过滤物体的物体 假设我有这个对象 Users w14FKo72BieZwbxwUouTpN7UQm02 name Naseebullah Ahmadi userT
  • 里氏替换原理、前提条件和抽象方法

    里氏替换原理 LSP 说 无法在子类型中强化先决条件 在 C 中 我可能会违反整个原则 如下所示 public class A public virtual void DoStuff string text Contract Require