Primordial List<T> Add()
Ne puis-je pas de surcharge de la Liste Ajouter une méthode ?
class ListDemo<T>:List<T>
{
public override T Add<T>(T value)
{
return base.Add(value);
}
}
Je reçois l'erreur suivante :
1) paramètre de Type " T " a le même nom que le paramètre de type de l'extérieur de type 'CollectionsExample.ListDemo
2) 'CollectionsExample.ListDemo.Ajouter(T)': pas de méthode appropriée trouvé pour remplacer
Pourquoi êtes-vous sous-classement
Aussi, réplique exacte: stackoverflow.com/questions/580202/...
Daniel Pryden .Merci .Je suis débutant. l'apprentissage à partir de vous, les gens.
Combien de fois avez-vous re-mettre en œuvre les
List<T>
au lieu de simplement la mise en œuvre de IList<T>
(et en favorisant la composition à la place de l'héritage)?Aussi, réplique exacte: stackoverflow.com/questions/580202/...
Daniel Pryden .Merci .Je suis débutant. l'apprentissage à partir de vous, les gens.
Combien de fois avez-vous re-mettre en œuvre les
IList<T>
interface dans vos projets? System.Collections.ObjectModel.Generic.Collection<T>
est presque toujours un meilleur choix si tout ce que vous voulez faire est de remplacer les méthodes comme Add
ou Remove
d'une liste.
OriginalL'auteur user196546 | 2009-10-26
Vous devez vous connecter pour publier un commentaire.
Au lieu de sous-classement de
List<T>
, vous devriez encapsulerList<T>
et de mettre en œuvreIList<T>
. Cela rend plus facile à gérer "substitution de" le comportement d'Ajouter:List<T>
ne devrait pas être partie de votre public à l'API, il devrait être un détail d'implémentation.Collection<T>
est personnalisable mise en œuvre soutenue par uneList<T>
, donc il devrait être sérieusement envisagée plus de re-rouler le code pour faire simple (et garder le focus sur les parties où cette mise en œuvre diffère deList<T>
).OriginalL'auteur Reed Copsey
Le code correct est:
Vous n'avez pas besoin d'un type de paramètre à la fois la déclaration de la classe et de la méthode. C'est la déclaration de la classe qui est générique dans ce cas, de sorte lorsque vous essayez de déclarer la méthode Add de la prise d'un paramètre de type générique nommé T, le compilateur va se plaindre que vous êtes à essayer d'avoir 2 paramètres de type avec le même nom.
Modifier: correction de l'exemple de code. Depuis Ajouter n'est pas virtuel, il ne peut pas être remplacé par le mot clé override (si l'échantillon initial serait effectivement pas de compilation). Vous pouvez toujours déclarer en utilisant de nouveau, mais qui pourrait conduire à différents sens de votre méthode Add. Je vous recommande de considérer la mise en œuvre de IList<T>, comme suggéré dans les commentaires.
List.Add()
n'est pas déclarée comme virtuelle, si vous utilisez cetteListDemo
classe dans le code qui s'attend à unList
, remplacésAdd()
méthode ne sera pas appelée.Cela permettra d'avertir. Vous devriez utiliser de nouvelles, de ne pas remplacer, mais qui ne va pas faire ce que vous attendez...
-1 - ce n'est pas correct. Liste<T>.Ajouter n'est pas marqué comme virtuel de sorte que votre solution ne fonctionne pas.
-1 - ce ne sera pas compilé. La méthode Add de type void, pas T
Vous avez raison, Ajouter n'est pas virtuel. Modifié la réponse.
OriginalL'auteur driis
Cela a fonctionné pour moi (basée sur Sam Harwell (commentaire):
OriginalL'auteur IngoB
Si vous voulez une collection dans laquelle vous voulez remplacer votre Ajouter/Insérer ou d'Indexation, alors vous pourriez créer votre propre collection qui héritent de:
et remplacer les méthodes suivantes:
la première est appelée par la méthode Add() et l'Insert(),
tandis que le second est appelé par ce[]
La
List<T>
Ajouter ne peut pas être changé depuis la collection est faite pour la performance, et donc la principale possibilité est volontairement suppriméOriginalL'auteur Askar Rayapov
Découlant de
List<T>
est presque toujours inutile. Voir ma réponse à cette autre question pour un récapitulatif complet:Comment créer une collection personnalisée .NET 2.0
OriginalL'auteur Sam Harwell
Découlant de la Liste n'est pas inutile, si c'est la classe qui vous donne ce dont vous avez besoin. Et tout ce que vous voulez faire est d'ajouter un couple de méthodes, telles que
FindCar(Car dodge).
OriginalL'auteur mintlucky