С#: проблема наследования со списком <T>

Предположим, что этот класс в С#:

public class LimitedList<T> : List<T>
{
    private int _maxitems = 500;

    public void Add(T value) /* Adding a new Value to the buffer */
    {
        base.Add(value);
        TrimData(); /* Delete old data if lenght too long */
    }

    private void TrimData()
    {
        int num = Math.Max(0, base.Count - _maxitems);
        base.RemoveRange(0, num);
    }
}

Компилятор дает мне это предупреждение в строке "public void Add (T value)":

предупреждение CS0108: 'System.LimitedList.Add(T)' скрывает унаследованный элемент 'System.Collections.Generic.List.Add(T)'. Используйте новое ключевое слово, если нужно было скрывать.

Что мне нужно сделать, чтобы избежать этого предупреждения?

спасибо 4 ваша помощь

Ответы

Ответ 1

Нет - не использовать new здесь; что не дает вам полиморфизма. List<T> не предназначен для наследования таким образом; используйте Collection<T> и override метод Add InsertItem.

public class LimitedCollection<T> : Collection<T>
{
    private int _maxitems = 500;

    protected override void InsertItem(int index, T item)
    {
        base.InsertItem(index, item);
        TrimData(); /* Delete old data if lenght too long */
    }

    private void TrimData()
    {
        int num = Math.Max(0, base.Count - _maxitems);
        while (num > 0)
        {
            base.RemoveAt(0);
            num--;
        }
    }
}

Ответ 2

Вы можете избежать этого предупреждения, добавив в объявление "новое".

public new void Add(T value) { 
 ...
}

Однако я думаю, что вы можете немного подойти к этой проблеме, используя Inheritance. С моей точки зрения, LimitedList не является списком, потому что он выражает совсем другое поведение, поскольку он создает жесткое ограничение количества данных в Списке. Я думаю, было бы намного лучше не наследовать от List, но иметь List как переменную-член.

Другая причина, по которой это плохая идея, заключается в том, что вы не сможете удовлетворить контракт с классом, если он рассматривается как список. В следующем коде будет использоваться метод List`s Add, а не LimitedList.

List<int> list = new LimitedList<int>(10);
for ( i = 0; i < 10000; i++ ) {
  list.Add(i);
}

Ответ 3

Вам нужно объявить свой метод "Добавить" как "новый" (заменяющий) метод. Попробуйте следующее:

public class LimitedList<T> : List<T>
{
    private int _maxitems = 500;

    public new void Add(T value) /* Adding a new Value to the buffer */
    {
        base.Add(value);
        TrimData(); /* Delete old data if length too long */
    }

    private void TrimData()
    {
        int num = Math.Max(0, base.Count - _maxitems);
        base.RemoveRange(0, num);
    }
}

обратите внимание на ключевое слово "новое" в объявлении "Добавить (..." ).

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

Ответ 4

Как и другие, вы должны добавить новое ключевое слово. Причина этого в том, что в базовом классе (List <T> ) метод Add не был помечен ключевым словом "virtual", который в основном означает "overridable". Поэтому он должен быть отмечен как "новый".