代码契约:如何处理继承的接口?

2024-03-14

我正在使用 MS Code Contracts,并且在使用接口继承和 ContractClassFor 属性时遇到了障碍。

给定这些接口和合约类:

[ContractClass(typeof(IOneContract))]
interface IOne { }
[ContractClass(typeof(ITwoContract))]
interface ITwo : IOne { }

[ContractClassFor(typeof(IOne))]
abstract class IOneContract : IOne { }
[ContractClassFor(typeof(ITwo))]
abstract class ITwoContract : IOneContract, ITwo { }

假设 IOne 和 ITwo 是实质性接口。因此 IOneContract 中将包含大量代码用于必要的检查。

我不想为 IOne 接口重复 ITwoContract 中的所有内容。我只想为 ITwo 接口添加新合约。从一个合约类继承另一个合约类似乎是重用该代码的可能方法。但我收到以下错误:

EXEC : warning CC1066: Class 'ITwoContract' is annotated as being the contract for the interface 'ITwo' and cannot have an explicit base class other than System.Object.

这是代码合同中的限制还是我做错了?我们的项目中有很多接口继承,如果我不知道如何解决这个问题,这感觉就像代码契约的交易破坏者。


代替:

[ContractClassFor(typeof(ITwo))]
abstract class ITwoContract : IOneContract, ITwo { }

只需继承合约即可:

[ContractClassFor(typeof(ITwo))]
abstract class ITwoContract : ITwo { }

您只需要提供有关新方法的合同ITwo。合同来自IOneContract会自动继承,并且可以声明所有继承的IOne方法是抽象的——事实上,你cannot提供合同IOne on ITwoContract,不然CC会抱怨的:)

例如,如果你有这个:

[ContractClass(typeof (IOneContract))]
interface IOne
{
    int Thing { get; }
}

[ContractClass(typeof (ITwoContract))]
interface ITwo : IOne
{
    int Thing2 { get; }
}

[ContractClassFor(typeof (IOne))]
abstract class IOneContract : IOne
{
    public int Thing
    {
        get
        {
            Contract.Ensures(Contract.Result<int>() > 0);
            return 0;
        }
    }
}

[ContractClassFor(typeof (ITwo))]
abstract class ITwoContract : ITwo
{
    public int Thing2
    {
        get
        {
            Contract.Ensures(Contract.Result<int>() > 0);
            return 0;
        }
    }

    public abstract int Thing { get; }
}

然后这个实现将在两种方法上显示“未经证实的合同”,正如预期的那样:

class Two : ITwo
{
    public int Thing
    {
        get { return 0; }
    }

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

代码契约:如何处理继承的接口? 的相关文章

  • 代码合同:ccrewrite 退出并显示代码 -1?

    我是代码合同的新手 我下载了最新版本的代码合约项目 1 4 40314 1 并开始在我的项目中实现它 当我通过 VS2010 中的 代码合同 选项卡启用 运行检查 时 出现此错误 Error 1 The command C Program
  • .NET 3.5 的代码契约搞乱了 VS10 的调试器

    我最近使用代码契约迁移了很多手动前提条件测试和异常抛出 我没有升级到 NET 4 而是使用Microsoft Contracts dll程序集 这样我就可以坚持使用 NET 3 5 更长的时间 这是一个由 NET 3 5 和 NET 4 程
  • 代码合约发生了什么?

    几年前 在 NET 4 发布之前 代码契约就已经遍布博客圈 NET 4 中包含的运行时组件以及更昂贵的 Visual Studio 2010 版本中提供的静态检查器 不过 围绕代码合约的讨论似乎已经平息 人们是否在生产中使用它 微软研究院还
  • .net core 是否支持代码契约?

    在 net 框架中 有代码契约允许我在代码中指定前置 后置条件 net core net 5 支持它们吗 命名空间System Diagnostics Contracts可用 但项目是弃 另类VS2019 https softwarerec
  • 如何使用Python“抓取”包含弹出窗口的网站?

    我正在尝试使用 python 来抓取 etherscan 网站的某个部分 因为没有用于此功能的 api 基本上会去这个链接并且需要按验证 执行此操作后会出现一个弹出窗口 您可以看到here 我需要刮的是这部分0x0882477e7895bd
  • 有关 C# 4.0 中的代码契约的书籍 [已关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 虽然我已经了解代码契约有一
  • CodeContracts:可能在空引用上调用方法

    我正在与CodeContracts静态分析工具 https marketplace visualstudio com items itemName RiSEResearchinSoftwareEngineering CodeContract
  • 合约类应该是一个抽象类

    下面的代码给了我警告Contract class FooContracts should be an abstract class 从我在线阅读的所有示例中 例如http www infoq com articles code contra
  • 代码合同 - Visual Studio Team Service 脚本化构建服务器单元测试失败

    我最近将代码契约添加到我的解决方案中 经过一些修改后 我们的构建运行没有任何问题 但我们的单元测试由于代码契约而失败 环境 源代码控制和构建服务器托管在Visual Studio 团队服务 https www visualstudio co
  • 有问题的 System.Diagnostics.Contracts 的有用性

    我一直在使用新的 System Diagnostics Contracts 类 因为它一开始看起来非常有用 用于检查入站参数 返回值等的静态方法 它是一个干净的接口 可以替换大量 if then 语句和内部构建的库工具 然而 它在大多数运行
  • 代码合同。如何抑制生成代码的警告?

    如何关闭对 Linq2Sql 代码的静态检查 您可以通过将有问题的类标记为来抑制对静态代码的检查 ContractVerification false 如果您生成的类是partial您可以创建另一个文件 其中包含另一个部分 ial 并将其添
  • 如何在 .NET 4.0 中使用代码契约而不让我的代码看起来混乱?

    我已经开始使用代码契约 并发现很难立即发现方法的 本质 以这个 非常简单 为例 public static void UserAddNew string domain string username string displayName C
  • Collections.sort() 比较方法违反了 Java 中的一般约定[重复]

    这个问题在这里已经有答案了 我知道这种问题已经被问过数百万次 如果不是数十亿次 但我还找不到答案 This compare 方法没有Long Double Float 它只有Date boolean and Null检查员 但是它告诉我co
  • JavaScript 代码合约库?

    我刚刚启动一个新的 Web 应用程序 我想在 JavaScript 中实现某种形式的契约式样式验证 我快速谷歌搜索了一下 发现Js联系方式 http kinsey no blog index php 2010 02 03 jscontrac
  • 单声道的代码合同?

    单声道支持吗代码合约 http msdn microsoft com en us devlabs dd491992 IE 如果我构建一个类库 单声道用户可以使用我的程序集吗 如果没有 有其他库吗 最好支持静态分析 通过 Visual Stu
  • 为什么我不能在重写的方法中添加 Contract.Requires ?

    我正在使用代码契约 实际上 正在学习使用它 我面临着一些奇怪的事情 我重写了在第 3 方程序集中定义的方法 我想添加一个Contract Require像这样的声明 public class MyClass MyParentClass pr
  • 代码契约和异步

    将后置条件添加到返回的异步方法的推荐方法是什么Task
  • .Net 3.5 使用代码契约实现 String.IsNullOrWhitespace

    我正在尝试在我的 Net 3 5 C 项目中使用合同 我发现我在哪里写过类似的东西if string IsNullOrEmpty s string IsNullOrEmpty s Trim throw new ArgumentExcepti
  • 代码契约:确保未经验证并需要未经验证

    我不确定我是否在这里做错了什么或者是否需要修复 我有一个自定义的 Dictionary 包装类 这是必要的代码片段 public int Count get Contract Ensures Contract Result
  • Visual Studio 2015 中代码契约的最佳替代方案是什么?

    我希望以尽可能最优雅的方式验证代码中的方法参数 代码契约在 2015 年似乎不起作用 有人使用任何替代方案吗 他们正在努力 https github com Microsoft CodeContracts pull 36 https git

随机推荐