C #: Problema de herencia con la lista

Asummos esta clase en C #:

public class LimitedList : List { 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); } } 

El comstackdor me da esta advertencia en la línea “public void Add (T value)”:

advertencia CS0108: ‘System.LimitedList.Add (T)’ oculta el miembro heredado ‘System.Collections.Generic.List.Add (T)’. Usa la nueva palabra clave si te intentabas esconder.

¿Qué tengo que hacer para evitar esta advertencia?

Gracias 4 su ayuda

No, no uses new aquí; Eso no te da polymorphism. List no está destinada a la herencia de esta manera; use Collection y override el método Add InsertItem .

 public class LimitedCollection : Collection { 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--; } } } 

Puede evitar esta advertencia agregando “nuevo” a la statement.

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

Sin embargo, creo que puede estar abordando este problema un poco mal al usar Herencia. Desde mi perspectiva, LimitedList no es una lista porque expresa un comportamiento muy diferente, ya que impone una gran limitación a la cantidad de datos en la lista. Creo que sería mucho mejor no heredar de la Lista sino tener una Lista como variable miembro.

Otra razón por la que esta es una mala idea es que no podrá cumplir con el contrato de su clase cuando se vea como una Lista. El siguiente código utilizará el método Add de la lista y no LimitedList.

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

Debe declarar su método ‘Agregar’ como un método ‘nuevo’ (reemplazo). Prueba esto:

 public class LimitedList : List { 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); } } 

observe la palabra clave ‘nuevo’ en la statement ‘Agregar (…’).

Aunque, en este caso, debe crear su propia clase genérica implementando la interfaz IList. Espero que ayude.

Como han dicho otros, debe agregar la nueva palabra clave. El motivo de esto es que en la clase base (Lista ) el método Agregar no se ha marcado con la palabra clave “virtual”, que básicamente significa “anulable”. Por lo tanto, debe estar marcado como “nuevo”.