2013-06-21 57 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。

這可以這樣做,類似於srsyogesh's答案:

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) 
    { 

    } 
} 

當然,一個仍然可以投物業背到一個數組和改變它,但是這將是一種犯罪。取決於你的觀衆。爲了更加符合防彈要求,您可以不必僅僅返回現場,而是遍歷內容:

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