2013-10-10 3 views
1

안녕 스피과 나는 같은 것을 쓰기 :코드 계약 내 클래스 인터페이스에 내 코드 계약을 넣어하려고

[ContractClass(typeof(MyClassContract))] 
interface IMyClass 
{ 
    int Id { get; set; } 
} 

[ContractClassFor(typeof(IMyClass))] 
sealed class MyClassContract : IMyClass 
{ 
    public int Id 
    { 
     get { return Id; } 
     set { Contract.Requires(value > 0); } 
    } 
} 

public class MyClass : IMyClass 
{ 
    private int _id; 
    public int Id 
    { 
     get { return _id; } 
     set { _id = value; } 
    } 

} 

을하지만 계약에서 GET을 정의하도록 강요하고 싶지 않아요 그는 내가

get { return "abcdrdkldbfldsk"; } 

로 쓸 수 및 좋아하지 않는 것을 의미, 사용하지 않을 것 캔트

get { return ImyClass.Id; } 
쓰기 때문 내부 클래스의 공공 재산을 사용하도록 강요하는

편집 :

[ContractClassFor(typeof(IMyClass))] 
sealed class MyClassContract : IMyClass 
{ 
    int IMyClass.Id 
    { 
     set { Contract.Requires(value > 0); } 
    } 
} 
+0

하는 경우 get은 결코 사용되지 않을 것입니다. 단지'int Id {set; }'인터페이스에서, 그리고 그것을 구현하지 않는'MyClassContract'도 아니다'MyClass'에서? – luiscubal

+0

첫 번째 장소에서 get 속성을 노출하려고 할 때 ID가 0보다 작거나 같을 수 없다면 getter에이 요구 사항을 적용해야합니다. 인터페이스는 구현을 강제하지 않으므로 구체적인 클래스는 setter가 아닌 다른 메서드를 사용하여 Id 속성의 기본 값을 설정합니다. – Polity

+0

get은 MyClass에서 사용하고 MyClassContract에서는 가져옵니다. 절대 사용하지 않음 –

답변

2

당신이 ContractClassFor (MyClassContract)에 계약 불변을 추가하는 경우 :

[ContractInvariantMethod] 
private void ObjectInvariant() 
{ 
    Contract.Invariant (Id >= 0); 
} 

를 그런 다음 Ensures/Requires 쌍 될 것입니다 이 내가 쓰고 싶은 것입니다 속성에 대한 get/sets에 추가됩니다. 그런 다음 (즉, 여전히 때문에 인터페이스, 속성을 추가해야합니다)를 ContractClassFor

int Id { get; set; } 

에 자동 속성을 사용할 수 있습니다

(참고 2.3.1 of the reference)

here

+0

좋아, 뭔가지만, 공공 변수로 쓸 필요가 Contract.Invariant (MyClass.Id> = 0) 쓸 수 없습니다; 예외 유형을 지정하는 방법은 없습니다. –