Почему я не могу получить доступ к внутренним классам List <T>, когда я получаю от него?
class NewList<T> : List<T>
Почему я не могу получить доступ к внутренним элементам, например T[] _items
и т.д.
Почему они не защищены, но закрыты?
Должен ли я использовать композицию для этого?
Ответы
Ответ 1
Они частные, потому что автор (Microsoft) не собирался обращаться к ним, возможно, из соображений безопасности.
Вы должны использовать композицию вместо наследования. Сделайте свой класс открытым IList<T>
вместо List<T>
напрямую.
List<T>
никогда не должен подвергаться прямому воздействию в публичном API (это действительно указано в руководящих принципах проектирования). Он должен использоваться только как внутренняя реализация.
Ответ 2
List<T>
не предназначен для базового класса. Вместо этого вы должны использовать один из классов System.Collections.ObjectModel.
Ответ 3
Почему я не могу получить доступ к внутренним элементам T [] _items и т.д.?
Отражатель говорит, что _items является закрытым. Подчеркивание предлагает частный член
Почему они не защищены, но частный?
В случае _items Microsoft предоставляет общедоступный метод ToArray. Он возвращает _items.
Ответ 4
По замыслу, выставление членов выполняется только тогда, когда (абсолютно) необходимо, чтобы объект поддерживал правильное состояние во все времена. И не рекомендуется выделять поле (_items) как защищенное, для чего требуется защищенное свойство. В этом случае уже существует публичное свойство (это [])
Композиция даст вам еще меньше доступа - не защищенные члены.
Ответ 5
Вам это не нужно. То есть, что вы можете сделать с _items
, что вы не можете сделать с свойством Item : T
? Они дали вам простую функциональную абстракцию базовому массиву с помощью индексатора. Это очень легкий вес - все это он проверяет границы и увеличивает версию списка (на сеттере)...
var lst = new List<int>() { 1, 2, 3, 4, 5 };
lst[0].Dump(); // 1
lst.Dump(); // 1, 2, 3, 4, 5
lst[0] = 2;
lst.Dump(); // 2, 2, 3, 4, 5