gpt4 book ai didi

code-contracts - 代码契约(Contract) : How to deal with inherited interfaces?

转载 作者:行者123 更新时间:2023-12-04 06:38:39 24 4
gpt4 key购买 nike

我正在使用 MS Code Contracts,并且在使用接口(interface)继承和 ContractClassFor 属性时遇到了麻烦。

给定这些接口(interface)和合约类:

[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 是实体接口(interface)。因此 IOneContract 将包含大量代码以进行必要的检查。

我不想在 IOne 接口(interface)的 ITwoContract 中复制所有这些内容。我只想为 Itwo 接口(interface)添加新契约(Contract)。从另一个契约(Contract)类继承一个契约(Contract)类似乎是重用该代码的可能方式。但是我收到以下错误:
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.

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

最佳答案

代替:

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

只需继承契约(Contract):
[ContractClassFor(typeof(ITwo))]
abstract class ITwoContract : ITwo { }

您只需提供 ITwo 中新方法的契约(Contract).来自 IOneContract 的契约(Contract)会自动继承,你可以声明所有继承的 IOne抽象的方法——事实上,你不能为 IOne 提供契约。在 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; }
}

然后这个实现将在这两种方法上都说“未经证实的契约(Contract)”,正如预期的那样:
class Two : ITwo
{
public int Thing
{
get { return 0; }
}

public int Thing2
{
get { return 0; }
}
}

关于code-contracts - 代码契约(Contract) : How to deal with inherited interfaces?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3197797/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com