2009-05-22 10 views
5

Supposons que cette classe en C#:C#: Problème d'héritage avec Liste <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); 
    } 
} 

Le compilateur me donne cet avertissement dans la ligne "public void Ajouter (valeur T)":

avertissement CS0108: 'System.LimitedList.Add (T)' masque le membre hérité 'System.Collections.Generic.List.Add (T)'. Utilisez le nouveau mot-clé si la cache était destinée.

Que dois-je faire pour éviter cet avertissement?

Thx 4 votre aide

+1

N'oubliez pas de surcharger le comportement du reste de l'interface si vous utilisez l'héritage. Sinon, vous avez juste besoin de faire une collection qui a une collection, pas une collection. –

Répondre

12

Non - ne le font pas usagenew ici; cela ne vous donne pas de polymorphisme. List<T> n'est pas destiné à l'héritage de cette manière; utiliser Collection<T> et override la méthode AddInsertItem.

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

Ceci est une bien meilleure explication sur la façon de coder correctement ceci. Merci Marc – CodeLikeBeaker

+0

que je dois mettre en œuvre l'ensemble de l'interface?! –

+0

Non - voir la mise à jour –

11

Vous pouvez éviter cet avertissement en ajoutant « nouveau » à la déclaration.

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

Cependant, je pense que vous pouvez aborder ce problème un peu mal à l'aide d'héritage. De mon point de vue, LimitedList n'est pas une liste car elle exprime un comportement très différent car elle impose une contrainte forte sur la quantité de données dans la liste. Je pense qu'il serait préférable de ne pas hériter de List mais d'avoir une liste comme variable membre.

Une autre raison pour laquelle ceci est une mauvaise idée est que vous ne serez pas en mesure de satisfaire le contrat de votre classe lorsqu'il est considéré comme une liste. Le code suivant utilisera la méthode Add de List et non LimitedList.

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

+1 ... 14 sec –

+1

IMO c'est faux, cependant; il ne fournit pas de polymorphisme ... –

+0

Ce n'est pas correct que vous voulez remplacer non nouveau. –

1

Vous devez déclarer votre méthode 'Add' en tant que méthode 'nouvelle' (de remplacement). Essayez ceci:

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

avis, le « nouveau » mot-clé dans le 'Ajouter (... Déclaration

Bien que, dans ce cas, vous devez créer votre propre classe générique qui implémente l'interface IList. . espoir qui aide.

+0

Voir les autres réponses à propos de polymorphisme pour voir pourquoi ce n'est pas une bonne idée. –

0

Comme d'autres l'ont dit, vous devez ajouter le nouveau mot-clé. la raison en est que dans la classe de base (Liste <T>) la méthode Add n'a pas été marquée par la mot-clé "virtuel "ce qui signifie fondamentalement" overridable ". Par conséquent, il devrait être marqué comme "nouveau".

Questions connexes