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 :

Template de liste, question POO


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 33
    Par défaut Template de liste, question POO
    Bonjour,

    j'ai un problème de conception, je ne sais pas trop comment le résoudre.
    Je suis débutant en C#/C++ et j'ai beau avoir regardé en diagonale les design patterns, je bloque.

    voilà mon problème :

    J'ai des points :

    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
     
    public abstract class IPoint
        {
            public double x, y;
            public int id;
        }
     public class MonPoint1 : IPoint
        {
            string name;
        }
     
     public class MonPoint2 : IPoint
        {
            int arc;
        }
    Ils sont contenus dans des listes du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    List<MonPoint1> listePt1 ;
    List<MonPoint2> listePt2 ;
    et je veux les afficher dans une fonction "générique", sachant que pour les afficher c'est la même chose
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public void afficherPoints ( IList<IPoint> listePoint )
    {
      foreach( IPoint in listePoint)
    {
       drawPoint( IPoint.x , IPoint.y );
    }
    }
    voilà, ça c'est la théorie, sauf que - et c'est pas illogique - le compilateur ne veut pas me convertir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     List<MonPoint1> listePt1 ;
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<MonPoint2> listePt2 ;
    en donc je ne peux pas appeler ma fonction "générique"

    Comment faire ?
    précision : je ne veux pas mettre du code d'affichage dans ma classe IPoint

    Losformen

  2. #2
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    C'est tout a fait normal
    C'est ce qu'on appelle la covariance de type.
    http://msdn.microsoft.com/fr-fr/library/dd799517.aspx

    Ca ne marche pas avec IList<T> mais ca marche avec IEnumerable<T>

    Edit: d'ailleurs un IEnumerable suffit largement pour faire un foreach

    Note: Par convention, on utilise le I pour dire que c'est une interface or ta classe IPoint n'est pas une interface. Prefere le nom PointBase ou un truc du genre

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Nathanael Marchand Voir le message
    C'est tout a fait normal
    C'est ce qu'on appelle la covariance de type.
    http://msdn.microsoft.com/fr-fr/library/dd799517.aspx

    Ca ne marche pas avec IList<T> mais ca marche avec IEnumerable<T>
    En C# 4 seulement...


    Citation Envoyé par Nathanael Marchand Voir le message
    Note: Par convention, on utilise le I pour dire que c'est une interface or ta classe IPoint n'est pas une interface. Prefere le nom PointBase ou un truc du genre
    +1, j'allais le mentionner


    Sinon, il y a une solution simple pour régler le problème : rendre générique la méthode afficherPoints (il faudrait d'ailleurs l'appeler AfficherPoints avec un grand A, c'est la convention pour les méthodes publiques en C#)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public void AfficherPoints<TPoint>(IEnumerable<TPoint> listePoint ) where TPoint : IPoint
    {
      foreach( IPoint in listePoint)
      {
         drawPoint( IPoint.x , IPoint.y );
      }
    }

  4. #4
    Membre chevronné Avatar de Jerede
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2010
    Messages
    271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mai 2010
    Messages : 271
    Par défaut
    C'est étonnant, j'aurai crû que ça fonctionnais aussi, apparemment pas . Faudra que je regarde ce qu'est la covariance/contravariance
    Donc quand tu l'appelles tu peut faire un cast.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Draw(new List<Point1>() as IList<IPoint>);


    Trop tard.. ou dit comme au dessus

    Edit : Ah, autant pour moi

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Jerede Voir le message
    Donc quand tu l'appelles tu peut faire un cast.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Draw(new List<Point1>() as IList<IPoint>);
    Non, ça marchera pas. C'est une liste de Point1, pas de IPoint...

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 33
    Par défaut merci
    Bonjour,

    parfait ça marche !! merci à tous
    Merci à Nathanael pour ce lien, je n'ai pas trop compris pourquoi ça marche, mais ça marche.
    Subtil comme notion, est-ce la même chose en C++ ?

    Ok pour les conseils sur le nommage, "m'enfin..." (comme dirait Gaston) pour l'instant, il n'y a que moi qui code

    Losformen

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

Discussions similaires

  1. [Templates] Quelques questions POO/Template
    Par iwf-fr dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 27/04/2007, 16h04
  2. Question Poo en delphi
    Par the big ben 5 dans le forum Delphi
    Réponses: 6
    Dernier message: 03/11/2006, 10h25
  3. zone de liste question?
    Par escobar dans le forum Access
    Réponses: 9
    Dernier message: 28/06/2006, 13h30
  4. [POO] Question POO
    Par shadeoner dans le forum Langage
    Réponses: 1
    Dernier message: 10/04/2006, 14h51
  5. Réponses: 7
    Dernier message: 26/01/2006, 12h20

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