Почему я не могу получить доступ к внутренним объектам класса List <T>, когда я наследую его? - PullRequest
0 голосов
/ 11 августа 2009
class NewList<T> : List<T>

Почему я не могу получить доступ к его внутренностям, таким как T[] _items и т. Д.

Почему они не защищены, а закрыты?

Должен ли я использовать композицию для этого?

Ответы [ 5 ]

7 голосов
/ 11 августа 2009

Они являются частными, поскольку автор (Microsoft) не намеревался предоставить вам доступ к ним, возможно, по соображениям безопасности.

Вы должны использовать композицию вместо наследования. Сделайте так, чтобы ваш класс выставлял IList<T> вместо List<T> напрямую.

List<T> никогда не должен быть напрямую представлен в общедоступном API (это на самом деле указано в рекомендациях по проектированию). Он должен использоваться только как внутренняя деталь реализации.

2 голосов
/ 11 августа 2009

List<T> не предназначен для базового класса. Вместо этого вы должны использовать один из классов в System.Collections.ObjectModel .

1 голос
/ 11 августа 2009

По замыслу, экспонирование членов выполняется только тогда, когда (абсолютно) необходимо, чтобы объект всегда поддерживал правильное состояние. И не очень хорошая идея выставлять поле (_items) как защищенное, для которого требуется защищенное свойство. В этом случае уже есть публичная собственность (это [])

Композиция даст вам еще меньший доступ - никаких защищенных членов тоже нет.

1 голос
/ 11 августа 2009

Почему я не могу получить доступ к его внутренностям, как T [] _items и т. Д.?

Отражатель говорит, что _items является частным. Подчеркивание предлагает частный член

Почему они не защищены, но частный?

В случае _items Microsoft предоставляет общедоступный метод ToArray. Возвращает _items.

0 голосов
/ 11 августа 2009

Тебе это не нужно. То есть, что вы можете сделать с _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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...