Мой пример - ситуация, когда интерфейсам, которые наследуют базовый интерфейс, необходимо добавить условия публикации, являющиеся результатом их дополнительных полей - пример произошел, когда я решил использовать интерфейс IInitialise в качестве интерфейсов, которые наследуются от этого неизменно желаемого условие pre / post добавлено в метод Initialize.
Я вижу, что проблема в том, что абстрактные реализации не имеют возможности избегать друг друга (из-за перехвата или переписывания).
[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: Если бы я добавил в этот метод require, я бы получил ошибку, подобную этой
Предупреждение 1 Класс контракта IEngine не может определить контракт для метода IInitialise.Initialise, поскольку его первоначальное определение не относится к типу IEngine. Вместо этого определите контракт для типа IInitialise. IEngine .cs
Есть идеи?