gpt4 book ai didi

c# - 继承接口(interface)时如何将实现添加到接口(interface)代码契约

转载 作者:太空狗 更新时间:2023-10-30 01:09:52 25 4
gpt4 key购买 nike

我的示例是这样一种情况,其中继承基本接口(interface)的接口(interface)需要添加作为其附加字段结果的后置条件 - 该示例发生在我决定拥有一个 IInitialise 接口(interface)时,因为从该接口(interface)继承的接口(interface)总是需要添加到 Initialise 方法的前置/后置条件。

我可以看出问题是由于抽象实现无法相互避免(由于拦截或重写器)。

    [ContractClass(typeof(IInitialiseContract))]
public interface IInitialise
{
bool IsInitialised { get; }
void Initialise();

}

[ContractClassFor(typeof(IInitialise))]
public abstract class IInitialiseContract : IInitialise
{

public bool IsInitialised
{
get { return default(bool); }
}

public void Initialise()
{
Contract.Ensures(IsInitialised == true);
}
}

然后我最终得到以下界面

  [ContractClass(typeof(IEnginecontract))]
public interface IEngine : IInitialise
{
ICommandManager CommandManager { get; }
IDictionary<int, IEntity> World { get; }
}

[ContractClassFor(typeof(IEngine))]
public abstract class IEnginecontract : IEngine
{

public ICommandManager CommandManager
{
get
{
Contract.Ensures(Contract.Result<ICommandManager>() != null);
return default(ICommandManager);
}
}

public IDictionary<int, IEntity> World
{
get
{
Contract.Ensures(Contract.Result<IDictionary<int, IEntity>>() != null);
return default(IDictionary<int, IEntity>);
}
}

public bool IsInitialised
{
get { return default(bool); }
}

public void Initialise()
{
// I would like to put my pre and post conditions here but
// cannot because it is implemented in the base interfaces contract.
}
}

我到了这里,但我想不出一个干净的方法来向 Initialise() 添加条件。

Edit2:如果我在这个方法中放了一个要求,我会得到这样的错误

警告 1 契约(Contract)类 IEngine 无法为方法 IInitialise.Initialise 定义契约(Contract),因为其原始定义不在类型 IEngine 中。相反,在类型 IInitialise 上定义契约(Contract)。引擎.cs

有什么想法吗?

最佳答案

任何来自接口(interface)而不是您为其编写契约的接口(interface)的方法都应标记为抽象。这些方法的约定将自动继承,您不能更改它们(否则这会改 rebase 本接口(interface)的含义,这没有意义)。

所以你应该有你的基础接口(interface)和它的契约:

[ContractClass(typeof(IInitialiseContract))]
public interface IInitialise
{
bool IsInitialised { get; }
void Initialise();

}

[ContractClassFor(typeof(IInitialise))]
public abstract class IInitialiseContract : IInitialise
{

public bool IsInitialised
{
get { return default(bool); }
}

public void Initialise()
{
Contract.Ensures(IsInitialised == true);
}
}

以及您的派生接口(interface)及其契约(注意抽象继承的):

[ContractClass(typeof(IEnginecontract))]
public interface IEngine : IInitialise
{
ICommandManager CommandManager { get; }
IDictionary<int, IEntity> World { get; }
}

[ContractClassFor(typeof(IEngine))]
public abstract class IEnginecontract : IEngine
{

public ICommandManager CommandManager
{
get
{
Contract.Ensures(Contract.Result<ICommandManager>() != null);
return default(ICommandManager);
}
}

public IDictionary<int, IEntity> World
{
get
{
Contract.Ensures(Contract.Result<IDictionary<int, IEntity>>() != null);
return default(IDictionary<int, IEntity>);
}
}

public abstract bool IsInitialised {get;}
public abstract void Initialise();
}

关于c# - 继承接口(interface)时如何将实现添加到接口(interface)代码契约,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5954663/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com