2009-05-22 14 views
5

Asumamos esta clase en C#:C#: Problema herencia con la lista <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); 
    } 
} 

El compilador me da esta advertencia en la línea de "public void Add (valor T)":

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é debo hacer para evitar este aviso?

Thx 4 su ayuda

+1

No olvide anular el comportamiento del resto de la interfaz también si va a utilizar la herencia. De lo contrario, solo necesita hacer una colección que tenga una colección, no una colección. –

Respuesta

12

n - No uso new aquí; eso no te da polimorfismo List<T> no está destinado a la herencia de esta manera; use Collection<T> y override el AddInsertItem método.

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--; 
     } 
    } 
} 
+0

Esta es una explicación mucho mejor sobre cómo codificar esto correctamente. Gracias Marc – CodeLikeBeaker

+0

que tengo que implementar toda la interfaz? –

+0

No - vea la actualización –

11

Puede evitar esta advertencia mediante la adición de "nueva" a la declaración.

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

Sin embargo, creo que puede estar llegando a 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 restricción estricta a la cantidad de datos en la lista. Creo que sería mucho mejor no heredar de List pero tener una lista como variable miembro.

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

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

+1 ... 14 seg –

+1

IMO está equivocado; no proporciona polimorfismo ... –

+0

Esto no es correcto, usted desea anular no nuevo. –

1

Debe declarar su método 'Agregar' como método 'nuevo' (de reemplazo). Prueba esto:

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

aviso de la 'nueva' palabra clave en la declaración 'Añadir (...'

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

+0

Ver las otras respuestas sobre polimorfismo para ver por qué esta no es una buena idea. –

0

Como otros han dicho, es necesario agregar la nueva palabra clave. la razón de esto es porque en la clase base (Lista <T>) el método Add no se ha marcado con el palabra clave "virtual "que básicamente significa" invalidable ". Por lo tanto, debe marcarse como "nuevo".

Cuestiones relacionadas