2016-09-15 49 views
1

我有一個抽象基類的抽象字典屬性,集合屬性:如何執行子類來實現包含特定值

public abstract class BaseClass 
{ 
    //... 
    public abstract Dictionary<string, object> Settings { get; set; } 
    //... 
} 

我想子類實現與所謂的特定鍵此屬性「文本」(多個鍵如果需要,可以添加,但‘文字’鍵必須存在),例如:

public class ChildClass : BaseClass 
{ 
    //... 
    private Dictionary<string, object> _settings = new Dictionary<string, object>() 
    { 
     { "Text", "SomeText" } 
    }; 
    public Dictionary<string, object> Settings 
    { 
     get{ return _settings; } 
     set{ _settings = value; } 
    } 
    //... 
} 

什麼是強制執行的子類,不僅實現了財產,但以確保它包含的最佳方式一個名爲「文本」的關鍵值的關鍵?

+1

唯一的方法是將字典的操作封裝在基類中。它實際上尖叫着創建一個Settings類而不是使用Dictionary。如果您只是公開字典,則無法控制添加/刪除鍵。 – itsme86

+0

不要暴露'Dictionary'(使其對基類不公開),但例如'IReadonlyDictionary'並提供操作字典的方法(添加,刪除,與其他等結合)。這樣你就可以完全控制它的內容。 – Sinatr

回答

2

正如其他人建議我將隱藏的設置(字典)的執行情況,並揭露方法來訪問數據:

public abstract class BaseClass 
{ 
    //... 
    private readonly Dictionary<string, object> _settings = new Dictionary<string, object>(); 

    protected BaseClass() { } 

    public object GetSetting(string name) 
    { 
     if ("Text".Equals(name)) 
     { 
      return this.GetTextValue(); 
     } 
     return this._settings[name]; 
    } 

    // this forces every derived class to have a "Text" value 
    // the value could be hard coded in derived classes of held as a variable 
    protected abstract GetTextValue(); 

    protected void AddSetting(string name, object value) 
    { 
     this._settings[name] = value; 
    } 


    //... 
} 
+0

我最終重組了我的結構,所以這不適用,但我接受它作爲原始問題的最佳答案 –

0

我只是讓設置屬性非抽象。

public abstract class BaseClass 
{ 
    //... 
    protected Dictionary<string, object> Settings { get; set; } 
    public BaseClass() 
    { 
     Settings = new Dictionary<string, object>() 
     { 
      { "Text", "SomeText" } 
     }; 
    } 
    //... 
} 
0

感謝您的答案。看起來好像沒有一種好方法來強制子屬性包含特定的鍵,而無需在基類中封裝字典並編寫自定義get,設置方法或編寫另一個類來保存設置。

事實證明,在我的情況下,我只需要只讀訪問Settings屬性,因此我最終使用公共只讀字典包裝器更改爲基類的受保護字典屬性以公開內容。然後,我通過構造函數參數強制執行「文本」鍵上的設置。畢竟不需要抽象屬性。

相關問題