8
votes

Liste de remplacement Ajouter ()

Je ne peux pas savoir la méthode d'addition de la liste de surcharge? XXX

Je reçois l'erreur suivante:

1) Type paramètre 'T' a le même nom que le nom Paramètre de type de type externe 'collectionSExample.listdemo

2)' collectionSExample.listdemo.add (t) ': pas de méthode appropriée trouvée pour remplacer


4 commentaires

Pourquoi êtes-vous sous-classement Liste au lieu de simplement implémenter ilist (et en favorisant la composition au lieu de héritage)?


En outre, dupliqué exact: Stackoverflow.com/Questtions/580202/...


@ Daniel Pryden .Merci .Je suis débutant. apprendre de vous des gens.


@Daniel: Combien de fois mettez-vous ré-implémenter l'interface IList dans vos projets? system.collections.objectmodel.generic.collection est presque toujours meilleur choix si tout ce que vous voulez faire est de remplacer les méthodes telles que Ajouter ou supprimer d'une liste.


6 Réponses :


7
votes

Le code correct est le suivant:

class ListDemo<T>:List<T>
{
    public new void Add(T value)
    {
      base.Add(value);
    }
}


5 commentaires

Vous êtes correct, ce code compilera. Mais parce que list.add () n'est pas déclaré comme Virtual, si vous utilisez ce listdemo classe dans le code qui attend un code , le remplacement Ajouter () La méthode ne sera pas appelée.


Cela mettra en garde. Vous devriez utiliser de nouveaux, pas remplacer, mais cela ne va pas faire ce que vous attendez ...


-1 - Ce n'est pas correct. La liste .add n'est pas marquée comme virtuelle pour que votre solution ne fonctionne pas.


-1: masquant ajouter (t) est un moyen sûr d'introduire des bogues désagréables dans votre application. Le code modifiera réellement les comportements basés sur la question de savoir si elle est détenue dans une liste Liste ou listdemo variable, mais ne vous avertira jamais à propos de laquelle une utilisation est utilisée à tout moment donné. C'est un énorme non-non.


@ 280Z28, je suis d'accord, mais c'est la bonne réponse à la question. Je préférerais également une autre approche.



20
votes

au lieu du sous-classement de la liste , vous devez encapsuler list et implémenter ilist . Cela facilite la manipulation de «remplacer» le comportement de l'ajout: xxx

liste ne doit pas faire partie de votre API publique - cela devrait être une implémentation détail.


1 commentaires

Collection est une implémentation personnalisable sauvegardée par une liste , il devrait donc être sérieusement envisagé par rapport à la réémission du code pour le garder simple (et gardez le Concentrez-vous sur les parties où cette implémentation diffère de Liste ).



1
votes

résultant de la liste est presque toujours inutile. Voir ma réponse à cette autre question pour une exécution complète:

Comment créer une coutume Collection à .NET 2.0


0 commentaires

0
votes

résultant 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 quelques méthodes, telles que FindCar (voiture Dodge).


0 commentaires

4
votes

Cela a fonctionné pour moi (basé sur le commentaire de Sam Harwell):

public class ListDemo<T> : Collection<T>
{
    protected override void InsertItem(int index, T item)
    {
        // Your add condition ...
        if (!this.Any(x => ...))
            base.InsertItem(index, item);
    }
}


0 commentaires

3
votes

Si vous souhaitez une collection dans laquelle vous voudriez remplacer votre ajout / insertion ou indexer, vous pouvez créer votre propre collection qui hériterait de:

InsertItem();
SetItem();


1 commentaires

Cela signifie que je n'ai pas besoin de changer la façon dont j'utilise la méthode ajouter () dans l'ensemble du projet, non?