Зачем выводить класс List <T>только для пересчета индексатора? - PullRequest
4 голосов
/ 19 марта 2012

Я продолжаю видеть производные от List классы, которые выглядят примерно так

class MyClassList : List<MyClass>
{
    public MyClass this[int index]
    {
        get { return (MyClass)base[index]; }
    }
}

В чем смысл этого наследования?Похоже, это просто повторяет кастинг участника.Я мог бы понять другие типы индексатора, но это всего лишь переформулировка индексатора списка по умолчанию, и это вызывает предупреждение Visual Studio RE: скрытие базового индексатора.Это правильно или неправильно, и почему?

Ответы [ 7 ]

5 голосов
/ 19 марта 2012

Возможно, это очень плохая попытка предотвратить перезапись значений через индексатор?

MyClassList x = new MyClassList();
x.Add(new MyClass());
x[0] = new MyClass(); // Error!

Конечно, это не останавливает это:

List<MyClass> x = new MyClassList();
x.Add(new MyClass());
x[0] = new MyClass(); // No problem here...

По сути, это плохая идея. К сожалению, плохого кода предостаточно - не выводите полезности из простого существования: (

2 голосов
/ 19 марта 2012

Нет веских причин для этого.Он скрывает базовый индексатор вместо , переопределяя его, что может быть опасно и вообще не имеет никакого эффекта.

В большинстве случаев лучшепросто используйте List<MyClass> напрямую.Для этого не нужно создавать специальный класс, если вы вообще не планируете расширять функциональность List<>.

1 голос
/ 19 марта 2012

Я думаю, что предполагается скрыть аксессор set базового класса, чтобы он выглядел так, будто индексатор доступен только для чтения. Но это бесполезно, потому что очень легко обойти:

MyClassList list = ...

((List<MyClass>)list)[index] = value;

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

1 голос
/ 19 марта 2012

Я не вижу никакой пользы для этого.Кроме того, приведение не является необходимым.

0 голосов
/ 19 марта 2012

Я думаю, что код пытается вести себя как доступный только для чтения List. Нельзя было бы записать элемент переменной типа MyClassList<T> по индексу, хотя можно было бы привести его обратно к List<T> и записать переменную таким образом. Есть моменты, когда имеет смысл иметь переменную, тип которой имеет ограниченные возможности, содержать объект, чьи реальные возможности намного выше. Тем не менее, правильный способ сделать это, как правило, с интерфейсами, ярким примером является IEnumerable<T>. Если List<T> передается подпрограмме, которая принимает параметр типа IEnumerable<T>, подпрограмма может преобразовать свой параметр обратно в List<T> и использовать такие элементы, как Add(), Remove() и т. Д., Но должны подпрограммы, которые принимают параметр типа IEnumerable<T> не будет пытаться использовать его как что-либо еще.

Основная проблема со стилем кода, показанного оригинальным постером, состоит в том, что более «мощное» направление - это базовый, а не производный тип. Поскольку List<T> происходит от IEnumerable<T>, это означает, что все экземпляры List<T> могут быть перечислены, но не только некоторые перечисляемые вещи имеют дополнительные возможности в List<T>. Напротив, когда ваш класс реализован, каждый MyClassList<T> может быть прочитан и записан, но только некоторые экземпляры List<T> могут использоваться как MyClassList<T>.

0 голосов
/ 19 марта 2012

это, по сути, попытка для корректного переопределения [] доступа к List, для реализации некоторой пользовательской логики доступа к элементу.

Стоит отметить, что предоставленный код не годится , если не просто опасно . Если вы хотите сделать что-нибудь хитрое со списком, не переопределяйте (или склонны это делать) [], но реализуйте какой-то специальный метод для этой цели.

0 голосов
/ 19 марта 2012

Я видел подобные вещи раньше, когда люди хотели сериализовать их как другой тип, а пока, если это единственный код, и по другим причинам он не должен иметь тип MyClassList, это абсолютно бессмысленно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...