如果我有一个扩展A
的界面B
和界面A
,我可以创建一个继承BContract
的合同类AContract
吗?
如果我试试这个,我收到以下警告:
(1,1):警告CC1066:CodeContracts:类'BContract'被注释为接口'B'的合约,并且不能有除System.Object之外的显式基类。
我还没有对此进行测试,但我认为A
中BContract
接口的实现被忽略,AContract
中指定的合同优先 - 换句话说我可以从A
。
我很欣赏这样做并不是一件非常大的不便,但对于任何看BContract
的人来说,似乎都缺乏清晰度。它可以节省时间,空间和理解,以便从BContract
派生AContract
,为什么不支持?
答案 0 :(得分:2)
这是我的猜测(在发布之前我应该考虑过) - 如果接口B
扩展了多个接口 - 比如A
和C
,则附带合同类AContract
和CContract
- 哪个合同类应该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);
}
}