С#: проблема наследования со списком <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". Поэтому он должен быть отмечен как "новый".