Переопределяющий список <T>Добавить () - PullRequest
6 голосов
/ 26 октября 2009

Не могу ли я перегрузить метод Add списка?

class ListDemo<T>:List<T>
 {
    public override T  Add<T>(T value)
   {
      return base.Add(value);
   }
}

Я получаю следующую ошибку:

1) Параметр типа 'T' имеет то же имя, что и параметр типа из внешнего типа 'CollectionsExample.ListDemo

2) 'CollectionsExample.ListDemo.Add (T)': не найден подходящий метод для переопределения

Ответы [ 6 ]

15 голосов
/ 26 октября 2009

Вместо создания подкласса из List<T>, вы должны инкапсулировать List<T> и реализовать IList<T>. Это облегчает обработку "переопределения" поведения Add:

public class ListDemo<T> : IList<T>
{
    private List<T> list = new List<T>(); // Internal list
    public void Add(T item)
    {
       // Do your pre-add logic here
       list.Add(item); // add to the internal list
       // Do your post-add logic here
    }

    // Implement all IList<T> methods, just passing through to list, such as:
}

List<T> не должен быть частью вашего публичного API - это должна быть деталь реализации.

5 голосов
/ 26 октября 2009

Правильный код:

class ListDemo<T>:List<T>
{
    public new void Add(T value)
    {
      base.Add(value);
    }
}

Вам не нужен параметр типа как в объявлении класса, так и в методе. Это объявление класса, которое в данном случае является общим; поэтому, когда вы пытаетесь объявить метод Add как принимающий параметр общего типа с именем T, компилятор пожалуется, что вы пытаетесь иметь 2 параметра типа с одинаковым именем.

Редактировать : Исправлен пример кода. Поскольку Add не является виртуальным, его нельзя переопределить с помощью ключевого слова override (поэтому исходный пример фактически не будет компилироваться). Вы все еще можете объявить это, используя new, но это может привести к другому значению вашего метода Add. Я бы настоятельно рекомендовал просто внедрить IList , как это предлагается в комментариях.

2 голосов
/ 24 апреля 2017

Если вам нужна коллекция, в которой вы хотите переопределить свой Add / Insert или Indexer, тогда вы можете создать свою собственную коллекцию, которая будет наследоваться от:

Collection<T>

и переопределить следующие методы:

InsertItem();
SetItem();

первый вызывается с помощью Add () и Insert (), в то время как второй вызывается этим []

Добавление List<T> не может быть переопределено, так как коллекция сделана для производительности, таким образом, возможность переопределения намеренно удалена

2 голосов
/ 05 ноября 2014

Это сработало для меня (на основании комментария Сэма Харвелла):

public class ListDemo<T> : Collection<T>
{
    protected override void InsertItem(int index, T item)
    {
        // Your add condition ...
        if (!this.Any(x => ...))
            base.InsertItem(index, item);
    }
}
1 голос
/ 26 октября 2009

Получение от List<T> почти всегда бессмысленно. Смотрите мой ответ на этот другой вопрос для полного изложения:

Как создать собственную коллекцию в .NET 2.0

0 голосов
/ 07 октября 2010

Производить из списка не бессмысленно, если этот класс дает вам то, что вам нужно. И все, что вы хотите сделать, это добавить пару методов, таких как FindCar(Car dodge).

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