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

Я нашел это блестящее решение на GitHub:

  1. Ваша ОС ДОЛЖНА быть Windows
  2. Проверьте, что Python находится на вашем пути, написав python --version в консоль. Если нет, то
  3. Загрузите python 2.7 (я рекомендую chocolatey (choco install python2 -y)) и добавьте python.exe в переменную PATH.
  4. Разве вы не в Windows 7? Пропустите 5 и 6.
  5. Убедитесь, что у вас установлен .NET 4.5.1+ . Если нет, то
  6. Загрузите и установите .NET 4.5.1 (.NET 4.5.2 также будет отлично работать)
  7. Загрузите Инструменты сборки Microsoft Visual C ++ 2015 Technical Preview
  8. Использовать выборочную установку. Установите Windows 8.1 SDK, если вы еще этого не сделали. Видимо, не имеет значения, на какой ОС вы работаете. Вам просто нужен Windows 8.1 SDK.
  9. Установите для переменной конфигурации npm msvs_version значение 2015: npm config -g set msvs_version 2015
  10. Выполните npm i в любом другом проекте с зависимостью node-gyp без появления странных сообщений об ошибках

Мои ночные кошмары ушли!

5
задан 22 May 2009 в 14:30
поделиться

4 ответа

Нет - не используйте здесь новый ; это не дает вам полиморфизма. List не предназначен для наследования таким способом; используйте Collection и , переопределите метод 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--;
        }
    }
}
12
ответ дан 18 December 2019 в 06:36
поделиться

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

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

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

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

List<int> list = new LimitedList<int>(10);
for ( i = 0; i < 10000; i++ ) {
  list.Add(i);
}
11
ответ дан 18 December 2019 в 06:36
поделиться

Нет - не используйте здесь новый ; это не дает вам полиморфизма. List не предназначен для наследования таким способом; использовать Коллекция Попробуйте следующее:

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);
    }
}

обратите внимание на ключевое слово 'new' в объявлении 'Add (...'.

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

1
ответ дан 18 December 2019 в 06:36
поделиться

Как уже говорили другие, вам нужно добавить новое ключевое слово. Причина этого в том, что в базовом классе (List ) метод Add не отмечен ключевым словом «виртуальный», что в основном означает «переопределяемый». Поэтому он должен быть помечен как «новый».

0
ответ дан 18 December 2019 в 06:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: