接口中属性的代码协定

本文关键字:代码 属性 接口 | 更新日期: 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; }

(即由于接口的原因,仍然需要添加属性(

更多在这里