2013-06-21 2 views
1

저는 회사의 다른 개발자가 사용할 라이브러리를 작성하고 있습니다. 상태 머신 기본 클래스는 허용되는 상태 등이 ReadOnlyCollection<T>입니다. 개발자는이 클래스를 상속 받아 허용 된 상태를 설정해야합니다.파생 클래스에서 읽기 전용 개체 설정

나중에 파생 클래스의 생성자에서 ReadOnlyCollection<T>을 초기화하고 나중에 수정할 수 없도록 제한하려고합니다.

ReadOnlyCollection<T>을 기본 클래스의 읽기 전용 속성으로 선언하면 파생 클래스의 생성자에서 수정할 수 없으므로 작동하지 않습니다.

나는 이것이 드물지 않은 시나리오라고 생각합니다. 개발자가 부족할 때 달성 할 수있는 우아한 방법은 ReadOnlyCollection<T>을 덮어 쓰시겠습니까?

답변

3

직접 초기화하지 마십시오. 당신의 기본 클래스 생성자 인수로를들을 수 있도록 :

public class BaseClass 
{ 
     protected readonly Collection someObject; 
     public BaseClass(Collection object) 
     { 
      someObject = object 
     } 
} 

그래서 지금은 파생 클래스 생성자은 (는) 컬렉션 개체 으로도 기본 클래스 생성자를 호출해야 호출 할 때, 그렇지 않으면 컴파일시 에러 될 것입니다. 이렇게하면 콜렉션이 생성자에서 초기화되고 다른 곳에서는 초기화되지 않습니다.

public class Derivedclass : BaseClass 
{ 
     public DerivedClass() : base(/*pass the collection object here*/) 
     { 
     } 
} 

아직도 거기에 당신이 컬렉션의 참조를 얻을 경우, 당신은 여전히 ​​추가 또는 파생 클래스 유일의 수집 방법을 제거 호출하여 컬렉션을 수정할 수 있습니다,이에 구덩이 가을 당신에게 질수 재 초기화입니다 읽기 전용 인 경우.

0

ReadOnlyCollection이어야합니까? 나는 IEnumerable에 갈 것이다. 하나는 여전히 배열에 다시 속성을 캐스팅 할 수 물론

public abstract class StateMachine 
{ 
    public StateMachine(params States[] allowedStates) 
    { 
     _allowedStates = allowedStates; 
    } 

    private readonly IEnumerable<States> _allowedStates; 

    public IEnumerable<States> AllowedStates 
    { 
     get { return _allowedStates; } 
    } 
} 

public class DerivedStateMachine : StateMachine 
{ 
    public DerivedStateMachine() 
     : base(States.State1, States.State2) 
    { 

    } 
} 

및 변경,하지만 종류의 범죄 것 :

는 다음과 같이 할 수 유사한 답을 srsyogesh's합니다. 잠재 고객에 따라 다릅니다. 더 방탄하는 것으로 필드를 반환하는 대신 내용을 반복 할 수 있습니다.

public IEnumerable<States> AllowedStates 
    { 
     get 
     { 
      foreach(var state in _allowedStates) 
       yield return state; 
     } 
    }