不能在ContractClass中使用ContractAbbott

本文关键字:ContractAbbott ContractClass 不能 | 更新日期: 2023-09-27 18:20:41

我刚开始使用代码契约,发现ContractAbstractor属性可以用一种干净的方式描述契约。

然而,我无法使它在抽象类的契约类中工作。

给定这个简单的类:

[ContractClass(typeof(MyContractClass))]
internal abstract class MyClass
{
    public abstract int Position { get; }
    public abstract void Reset();
}

我想写一个合同类,以确保:

  • CCD_ 1总是大于或等于零
  • 对于新创建的实例,Position为零
  • CCD_ 3使CCD_ 4恢复到其初始值(零)

所以,我想出了这个合同类:

[ContractClassFor(typeof(MyClass))]
internal abstract class MyContractClass : MyClass
{
    internal MyContractClass()
    {
        this.EnsuresInitialState();
    }
    public override int Position
    {
        get
        {
            Contract.Ensures(Contract.Result<int>() >= 0);
            return default(int);
        }
    }
    public override void Reset()
    {
        this.EnsuresInitialState();
    }
    [ContractAbbreviator]
    private void EnsuresInitialState()
    {
        Contract.Ensures(this.Position == 0);
    }
} 

然而,当编译这个时,我得到了以下错误:

约定类MyContractClass引用成员MyContractClass.EnsuresInitialState,该成员不是被注释的抽象类/接口的一部分。

这是否意味着不可能在合同类中使用ContractAbbott方法,或者我在这里做错了什么

在这个简单的类中,使用缩写确实没有意义,因为要确保的状态只是一个属性。然而,在我的真实类中,我希望确保其他几个属性恢复到它们的初始值

我正在使用Visual Studio 2013更新4。

不能在ContractClass中使用ContractAbbott

EnsuresInitialState方法移动到抽象类并将其标记为protected。然后在调用它的抽象类中添加一个默认构造函数:

[ContractClass(typeof(MyContractClass))]
internal abstract class MyClass
{
    protected MyClass()
    {
        EnsuresInitialState();
    }
    [ContractAbbreviator]
    protected void EnsuresInitialState()
    {
        Contract.Ensures(Position == 0);
    }
    public abstract int Position { get; }
    public abstract void Reset();
}
[ContractClassFor(typeof(MyClass))]
internal abstract class MyContractClass : MyClass
{
    public override int Position
    {
        get
        {
            Contract.Ensures(Contract.Result<int>() >= 0);
            return default(int);
        }
    }
    public override void Reset()
    {
        EnsuresInitialState();
    }
}