예제는 기본 인터페이스를 상속 한 인터페이스가 추가 필드의 결과 인 포스트 조건을 추가해야하는 상황입니다. 인터페이스를 IInitialise 인터페이스로 유지해야합니다.이 인터페이스는 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.
}
}
내가 여기에 도착 다음과 같은 인터페이스를 끝내고 난 초기화를하는 조건을 추가하는 좋은 깨끗한 방법을 알아낼 수 없습니다().
Edit2가 : 내가 넣어 한 경우 내가 원래 정의 유형 IEngine에 아니므로 IEngine이 방법 IInitialise.Initialise에 대한 계약을 정의 할 수 없습니다이
경고 한 계약 클래스와 같은 오류를 가지고하는의 것이이 방법이 필요합니다. 대신 IInitialise 유형의 계약을 정의하십시오. IEngine .cs
아이디어가 있으십니까?
정확한 문제가 무엇
그래서 당신은 당신의 기본 인터페이스와 계약을해야합니까? 거기에 오류가 있습니까? 어딘가에 경고? –
오,이 코드는 경고가 아닙니다 ... 나는 Requires 나 Contract 클래스를 Contract 클래스의 Initialise 메소드에 추가하고 싶습니다. –