나는 많은 방법과 그 풀어서 속성 _isLoaded라는 사설 읽기 전용의 부울 필드 클래스가 나는 확신 객체 불변 방법이 알고하나의 메소드 만이 특정 필드를 수정할 수 있도록 코드 계약을 작성하는 방법이 있습니까? 공공 부울은 IsLoaded 표시 :
class MyClass
{
readonly bool _isLoaded;
public bool IsLoaded
{
get { return _isLoaded; }
}
public void Method1()
{
//does whatever
}
public void Method2()
{
//does another thing
}
public void Load()
{
//does a lot of things and then...
_isLoaded = true;
}
}
을 공개 메소드를 호출 한 후, 특정 그 객체는 여전히 일관된 상태를 유지합니다. 마찬가지로, 만약 내가 내 수업이 추가 :
[ContractInvariantMethod]
void checkState()
{
Contract.Invariant(!_isLoaded);
}
지금, 내 문제가 : 내 경우 (하나의 특정 공용 방법에 대한 ContractInvariantMethod 주석이 메소드를 호출하는 런타임을 말할 수있는 방법이있다, 로드), 그래서 그 중 하나의 방법으로 내 필드의 상태가 변경 될 것이라고 확신 할 수 있습니까?
(또는 다른 방법으로 같은 목적을 달성하십시오)
고마워요.
편집 :
@Liel
감사합니다.
이 패턴은 걱정할 필드가 하나만있을 때 완벽하게 작동합니다.
public abstract class BaseMyClass
{
private bool _isLoaded;
public bool IsLoaded
{
get { return _isLoaded; }
}
public virtual void Load()
{
Contract.Ensures(IsLoaded);
_isLoaded = true;
}
}
public class MyClass : BaseMyClass
{
public override void Load()
{
//does a lot of things and then...
base.Load();
}
}
불행하게도, 정적 검사 내가 사후 조건을 충족 base.Load()
전화를해야 알아낼만큼 똑똑하지 않다 : 나는 또한이 계약 사후 조건을 추가했다. 그것은 내가 단지 Contract.Assume(IsLoaded)
일 수 있다고 제안한다. .. 명백하게, 정적 체커는 완벽하지 않다.
:이를 컴파일 할 때
, 당신은 다음과 같은 경고를 얻을 수 있습니다를 내 대답이 도움이된다면, 당신은 항상 대답으로 받아 들일 수 있습니다. :) – Liel