不能在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。
将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();
}
}