IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

[C#] Peut-on spécifier un type générique de base pour une liste générique ?


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    Par défaut [C#] Peut-on spécifier un type générique de base pour une liste générique ?
    Bonjour à tous,

    J'aimerai proposer une liste personnalisée et typée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    class MaList<T>
    void Add(T objet);
    Le soucis c'est que c'est une liste d'objet commun, mais pas forcément de même type. Donc j'ai pensé à faire un type de base "Entity"

    Mais maintenant, comment imposer au type de ma liste un type qui hérite de Entity?

    C'est pour pouvoir faire des traitements commun sur les Entity de ma liste, sans pour autant mélanger une liste avec plusieurs types différents pour peu qu'ils soient fils de Entity...

    En effet, si je fait un objet qui encapsule une liste et que je propose des méthodes typées genre Add(Entity myEntity), on pourra par la suite ajouter un autre Entity qui est pas forcément du même type que les autres...

    Il existe quelque chose du genre
    ou quelque chose comme ça?

    Merci

    A bientôt

  2. #2
    Membre Expert
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Par défaut
    Salut mister3957,

    Donc tu veux creer une liste generique qui stoque des objets dont le type est connu à l'avance.

    C'est un peu contradictoire comme meme et ca n'a aucun interet , tu fais de la genericité pour que les types soient passés en parametres.

    Donc soit tu cree une liste generique et tu specifie lors de sa construction qu'elle est de type Entity, soit tu cree une liste fortement typée qui gere des Entity et des methodes comme tu as fait pour le Add

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    Par défaut
    Bah en fait j'ai plusieurs types qui dérivent de Entity, et chacun de ces types à des méthodes communes qui me servent dans ma liste...

    Du coup je voulais typer la classe de base, pour utiliser ces méthodes communes, mais qu'on puisse instancier une liste d'un type bien précis, seulement dérivant de Entity...

    Tu comprends ce que je veux faire?

    Par exemple j'ai plusieurs objet qui on un identifiant, et je voulais m'en servir dans ma liste, pour renvoi un objet à partir de sont identifiant

    Donc par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    class Entity
    {
         int GetId();
    }
    classe Entity1 : Entity
    classe Entity2 : Entity
     
    // Et ma liste:
    Class EntityList<T>
    {
         T Get(int id)
         {
               foreach(T entityIt in m_list)
               {
                     if(entityIt.GetId() == id)
                          return entityIt;
               }
               return null;
         }
    }
    Là ça veut pas parceque le type T n'a pas de méthode GetId(), et quand je fais ((Entity)T).GetId() (en supposant qu'on laisse à l'utilisateur de la classe la précaussion de passer un type issu de Entity, il ne veut pas compiler... et quand bien même ça serait pas terrible.

    Sans ça j'suis obligé de faire une méthode Get(int id) dans chacune de mes classes issues de ma liste... c'est pas top

    Comme ça on peut utiliser les fonction communes dans la liste, et on est sûr que dans la liste on a des objets de même types...

    Tu vois l'truc? On va dire que c'est du semi typage quoi, si ça peut se dire...

    Merci

  4. #4
    Membre Expert
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Par défaut
    Oui je comprends tres bien ce que tu veux faire mais je ne comprends pas encore pourquoi tu insiste à utiliser une classe generique alors qu'un truc de ce genre suffira :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Class EntityList
    {
    Entity[] m_list; //ou autre structure
         Entity Get(int id)
         {
               foreach(Entity entityIt in m_list)
               {
                     if(entityIt.GetId() == id)
                          return entityIt;
               }
               return null;
         }
    }
    Tu vois l'truc?

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Par défaut
    Salut,

    En fait il y a bien un intéret à faire ce que veut mister3957 en .Net, et on peut le faire grace aux contraintes. D'ailleurs sans ça les génériques seraient de bien peu d'utilité : on ne pourrait utiliser que les méthodes du type paramètre appartenant à la classe Object qque soit le type donné en paramètre.

    La syntaxe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class MaList<T> where T : Entity
    {
     
    }
    Indique au compilateur que T est (ou dérive) de Entity , et donc dans ta classe tu peux utiliser tte les méthodes définies par Entity.

  6. #6
    Membre Expert
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Par défaut
    +1 Sphax

    Le probleme est que j'ai deja lu a propos des contarintes pour les generics mais ca m'ai completement passé à travers .

    Citation Envoyé par Sphax
    D'ailleurs sans ça les génériques seraient de bien peu d'utilité
    Pas tout à fait d'accord sur ce point, les genriques sont tres utils meme sans cette fonctionnalité, d'ailleurs elle est recement introduite dans le framework 2.0

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 23/09/2009, 21h24
  2. Réponses: 2
    Dernier message: 24/06/2009, 12h30
  3. [TableAdapter] Peut-on en faire une liste générique ?
    Par sybaris dans le forum Framework .NET
    Réponses: 4
    Dernier message: 02/10/2008, 15h31
  4. Template pour une saisie générique
    Par strayyy dans le forum Langage
    Réponses: 3
    Dernier message: 05/01/2008, 14h21
  5. Sélection d'un champ d'une liste générique ?
    Par chuiben dans le forum Ada
    Réponses: 2
    Dernier message: 22/03/2007, 14h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo