2011-05-10 1 views
4

예제는 기본 인터페이스를 상속 한 인터페이스가 추가 필드의 결과 인 포스트 조건을 추가해야하는 상황입니다. 인터페이스를 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

아이디어가 있으십니까?

+1

정확한 문제가 무엇

그래서 당신은 당신의 기본 인터페이스와 계약을해야합니까? 거기에 오류가 있습니까? 어딘가에 경고? –

+0

오,이 코드는 경고가 아닙니다 ... 나는 Requires 나 Contract 클래스를 Contract 클래스의 Initialise 메소드에 추가하고 싶습니다. –

답변

2

나는 그것이 가능하지 않다고 생각합니다. 나는 코드 계약을 광범위하게 사용하고 내가 말할 수있는 한 - 나 자신과 같은 것을 시도한 것을 기억한다 - 파생 된 인터페이스의 코드 계약은 모든 조건을 다시 포함해야하며 상속받을 수 없다.

+0

슬프게도 당신이 정확하다고 생각합니다. 아무도 내게 다음 달에 더 좋은 대답을 주면 정확한 표시를 할 것입니다;) –

3

계약서를 작성하는 인터페이스가 아닌 다른 방법은 abstract으로 표시해야합니다. 이 메소드의 계약은 자동으로 상속 될 것이므로 변경할 수 없습니다 (또는 기본 인터페이스의 의미가 변경 될 수 있습니다).

[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 abstract bool IsInitialised {get;} 
    public abstract void Initialise(); 
} 
+0

그 추가 정보를 가져 주셔서 감사합니다. 나는 메소드를 구현하는 것을 피하려고 시도하지 않았다. - 나는이 접근법이 내가 배웠을 때 문서에 있다고 생각하지 않는다! –

+0

기본 인터페이스의 의미를 변경하는 것에 동의하지 않습니다. 이것은 새로운 inhetired 상속에 의존하는 수정이므로 더욱 특수화 된 인터페이스 정의에 대한 추가 요구 사항입니다. 묵시적 인터페이스의 변경은 없습니다. 설명서의 정당성을 알고 있지만이 방법은 메서드 정의에서 새 키워드에 해당하는 것을 얻고 싶지 않습니다 ... 예를 들어 인터페이스를 명시 적으로 구현하려면 어떻게해야합니까? –

+0

가능해야 할 경우가 있다는 데 동의합니다. 아마도 내가 다른 방식으로 라인을 말 했어야했는데, 여기에서 옵션을 제한하는 것은 구현입니다. – porges