为什么合同类不能继承?

时间:2011-02-21 11:06:51

标签: c# code-contracts

如果我有一个扩展A的界面B和界面A,我可以创建一个继承BContract的合同类AContract吗?

如果我试试这个,我收到以下警告:

  

(1,1):警告CC1066:CodeContracts:类'BContract'被注释为接口'B'的合约,并且不能有除System.Object之外的显式基类。

我还没有对此进行测试,但我认为ABContract接口的实现被忽略,AContract中指定的合同优先 - 换句话说我可以从A

中删除所有方法和属性

我很欣赏这样做并不是一件非常大的不便,但对于任何看BContract的人来说,似乎都缺乏清晰度。它可以节省时间,空间和理解,以便从BContract派生AContract,为什么不支持?

2 个答案:

答案 0 :(得分:2)

这是我的猜测(在发布之前我应该​​考虑过) - 如果接口B扩展了多个接口 - 比如AC,则附带合同类AContractCContract - 哪个合同类应该BContract继承?

总是简化基础接口,而不是混合存根和合同类的继承,这种模糊性较小。

答案 1 :(得分:1)

支持,但不是你想的方式:如果接口B派生自接口A,那么A上定义的所有合同也会自动 B定义。

编辑:这是评论的一个例子;

[ContractClass(typeof(IAContracts))]
interface IA
{
    void Foo(int x);
}

[ContractClass(typeof(IBContracts))]
interface IB : IA
{
    void Bar(int y);
}

[ContractClassFor(typeof(IA))]
abstract class IAContracts : IA
{
    public void Foo(int x)
    {
        Contract.Requires(x >= 0);
    }
}

[ContractClassFor(typeof(IB))]
abstract class IBContracts : IB
{
    // inherited from IA
    public abstract void Foo(int x);

    // declared in IB
    public void Bar(int y)
    {
        Contract.Requires(y >= 0);
    }
}