2016-11-04 6 views
0

У меня есть абстрактный класс с именем и свойством int. Я хочу управлять, потому что его нужно всегда сортировать.Остановить использование методов добавления и удаления в подклассе в абстрактном классе «Свойство списка»

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 по-прежнему доступен. У меня создалось впечатление, что создание _columnsToSearch только для чтения и только предоставление метода get в ColumnsToSearch скрывает любые методы, такие как «Добавить и удалять» в 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 не будет доступен для добавления или удаления. Этот обработчик событий должен находиться в подклассовой версии, потому что метод получения индекса столбца невозможен для абстрактного класса. –