2016-11-04 18 views
0

我有一個抽象類,它帶有一個int List字段和我想要控制的屬性,因爲它總是需要排序。停止使用抽象類的List類中的Add和Remove方法

public abstract partial class FindAndReplace : Form { 

    private readonly List<int> _columnsToSearch = new List<int>(); 
    public List<int> ColumnsToSearch { get { return _columnsToSearch; } } 

    public void AddToColumnsToSearch(int intToAdd) { 
     _columnsToSearch.Add(intToAdd); 
     _columnsToSearch.Sort(); 
    } 

    protected abstract void ColumnCheckBox_CheckChanged(object sender, EventArgs e); 

    ... 
} 

這是FindAndReplace的子類。我想強制它使用FindAndReplace的方法AddToColumnsToSearch,但在子類中,ColumnsToSearch上的Add方法仍然可用。我的印象是,使_columnsToSearch只讀,只給ColumnsToSearch上的get方法會隱藏任何方法,如ColumnsToSearch上的添加和刪除。

public partial class StepsTableFindAndReplace : FindAndReplace { 

    protected override void ColumnCheckBox_CheckChanged(object sender, EventArgs e) { 
     CheckBox cb = sender as CheckBox; 

     //get the columnIndex (removed the actual "get" code to keep simpler) 
     int colIndex = 0; 

     //can still use Add and Remove, want it to be 
     //AddToColumnsToSearch(colIndex) and RemoveFromColumnsToSearch(colIndex) 
     if (cb.Checked) ColumnsToSearch.Add(colIndex); 
     else   ColumnsToSearch.Remove(colIndex); 
    } 

    ... 
} 

有什麼我做錯了/不理解?

對於這個問題的答案給了我這個解決方案(即不工作)... C# get and set properties for a List Collection

+0

你可以建立你自己的實現IList <>的類,並在調用Add方法時實現你的需求 –

回答

0

儘量暴露ReadOnlyCollection<T>代替List<T>

0

readonly修飾符不會使集合成爲只讀;它只是防止在構造函數外設置字段。公共財產應該公開爲IReadOnlyCollection<int>,後臺字段應爲protected以允許子類修改列表。

1

readonly修飾符只能防止重新分配,並且使用ReadOnlyCollection<T>不能做你想要的,因爲你想在運行時改變它。

可以代替改變的private List<int>protected SortedSet<int>,這種種本身在修改:

public abstract partial class FindAndReplace : Form 
{ 
    protected readonly SortedSet<int> _columnsToSearch = new SortedSet<int>(); 

    // ... 

然後你就可以直接派生類訪問:

if (cb.Checked) 
{ 
    _columnsToSearch.Add(colIndex); 
} 
else 
{ 
    _columnsToSearch.Remove(colIndex); 
} 

然後返回新的收集訪問時,例如通過ToArray()

public IEnumerable<int> ColumnsToSearch 
{ 
    get 
    { 
     return _columnsToSearch.ToArray(); 
    } 
} 

注意,後者創建了一個斷開的情況:訪問ColumnsToSearch給你的_columnsToSearch副本在那一刻,違背了一個ReadOnlyCollection,這是在List<T>的包裝。

+0

是否有更好的方式保持列表排序而不是強制自定義添加和刪除方法? –

+0

這種方法保持列表排序,不需要自定義添加和刪除方法,所以我不明白你的問題。 – CodeCaster

+0

CheckChanged事件處理程序位於子類中,因此_columnsToSearch將無法進行添加或刪除操作。此事件處理程序必須位於子類版本中,因爲獲取列索引的方法不可能爲抽象類執行。 –