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

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(使用前将#替换为@)

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

随机推荐

  • 如何更新 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