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

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

[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的契约(Contract),否则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/

10-10 03:17