接口中属性的代码协定
本文关键字:代码 属性 接口 | 更新日期: 2023-09-27 18:34:58
嗨,我
试图将我的代码合约放在我的类的接口上,我写了这样的东西:
[ContractClass(typeof(MyClassContract))]
interface IMyClass
{
int Id { get; set; }
}
[ContractClassFor(typeof(IMyClass))]
sealed class MyClassContract : IMyClass
{
public int Id
{
get { return Id; }
set { Contract.Requires(value > 0); }
}
}
public class MyClass : IMyClass
{
private int _id;
public int Id
{
get { return _id; }
set { _id = value; }
}
}
但是不喜欢被迫定义一个永远不会使用的 Get In 合约,这意味着我可以把它写成
get { return "abcdrdkldbfldsk"; }
并且不喜欢仅仅因为不会写而被迫在内部类中使用公共属性
get { return ImyClass.Id; }
编辑:这就是我想写的:
[ContractClassFor(typeof(IMyClass))]
sealed class MyClassContract : IMyClass
{
int IMyClass.Id
{
set { Contract.Requires(value > 0); }
}
}
如果在ContractClassFor
中添加合约不变量 ( MyClassContract
(:
[ContractInvariantMethod]
private void ObjectInvariant ()
{
Contract.Invariant (Id >= 0);
}
然后将在属性的获取/集合上添加一个Ensures
/Requires
对。(参考文献2.3.1(
然后,可以在ContractClassFor
中使用自动属性
int Id { get; set; }
(即由于接口的原因,仍然需要添加属性(
更多在这里