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 :

Problème d'héritage de List


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2004
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 43
    Par défaut Problème d'héritage de List
    Bonjour,

    J'ai un petit souci d'héritage. Je vous expose le problème :

    J'ai une classe Hand.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public class Hand : List<Card> 
    [...]
    Dans une autre classe, j'ai le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Hand hand = new Hand();
    [...]
    hand = hand.OrderBy(c => c.Val).ToList();
    Le code ne compile pas et j'ai l'erreur suivante : "Impossible de convertir implicitement le type 'System.Collections.Generic.List<Poker.Card>' en 'Poker.Hand'. Une conversion explicite existe (un cast est-il manquant*?)
    ". Ce que je ne comprends déjà pas puisque la classe Hand hérite de List<Card>.


    J'essaye donc de faire le cast :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    hand = (Hand)hand.OrderBy(c => c.Val).ToList();
    Cette fois, le code compile mais me renvoie une erreur au Runtime :
    "Impossible d'effectuer un cast d'un objet de type 'System.Collections.Generic.List`1[Poker.Card]' en type 'Poker.Hand'"

    Si vous pouviez m'éclairer, je vous remercie.

  2. #2
    Membre actif
    Homme Profil pro
    Architecte C#
    Inscrit en
    Février 2003
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte C#

    Informations forums :
    Inscription : Février 2003
    Messages : 78
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Hand hand = new Hand();
    [...]
    hand = hand.OrderBy(c => c.Val).ToList();
    Te retourne une List<Card> or selon ta déclaration,

    une Hand est une List<Card> par contre, le contraire n'est pas vrai.

    Tu ne peux donc pas considérer une List<Card> comme une hand.

    Pour pallier à ca, tu pourrais par exemple surcharger le constructeur avec enumerable:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public class Hand : List<Card> 
    {
        public Hand(IEnumerable<Card> cards):base(cards){}
    [...]
    et l'utiliser comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hand = new Hand(hand.OrderBy(c => c.Val));

    Cependant, je te conseille plutôt de créer un objet Hand qui soit composé d'une List<Card> plutôt que d'hériter de la List. Ce sera plus simple pour gérer les évolutions.


    Bonne journée

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2004
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 43
    Par défaut
    Merci Effectivement, c'était logique.

    Cependant, je te conseille plutôt de créer un objet Hand qui soit composé d'une List<Card> plutôt que d'hériter de la List. Ce sera plus simple pour gérer les évolutions.
    C'est bien ce que j'avais fait au début avant de vouloir revenir vers l'héritage.

    Bonne journée

  4. #4
    Membre émérite
    Avatar de dkmix
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    619
    Détails du profil
    Informations personnelles :
    Localisation : Jamaïque

    Informations forums :
    Inscription : Septembre 2007
    Messages : 619
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Hand hand = new Hand();
    [...]
    hand = hand.OrderBy(c => c.Val).ToList();
    La fonction OrderBy ne retourne pas un "Hand", elle retourne un "System.Linq.IOrderedEnumerable"

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2004
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 43
    Par défaut
    Non elle renvoie, dans ce cas, une List<Card>.

    Elle retourne un "System.Linq.IOrderedEnumerable" si on enlève ToList().

  6. #6
    Membre émérite

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2011
    Messages : 487
    Par défaut
    C'est ce qu'essaye de t'expliquer dkmix

    La fonction OrderBy() renvoie un "System.Linq.IOrderedEnumerable".

    C'est la fonction ToList() qui renvoie une liste (Logique :p)

    En gros, voici les méthodes telles qu'elles pourraient être codées (C'est pas le cas en fait, mais passons)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public System.Linq.IOrderedEnumerable<T> OrderBy<T>(...)
    {
        // Implémentation
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public List<T> ToList<T>(...)
    {
        // Implémentation
    }

    Voici une manière de faire :

    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 class Hand
    {
        private List<Card> hand = new List<Card>();
     
        public void OrderBy()
        {
            hand = hand.OrderBy(card => card.Value);
        }
     
        public void OrderByDesc()
        {
            hand = hand.OrderByDesc(card => card.Value);
        }
    }
    Il te suffira ensuite de faire uniquement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    hand.OrderBy(); // Tri du plus petit au plus grand
    hand.OrderByDesc(); // Tri du plus grand au plus petit
    My two cents

    PS: Ceci est une des solutions possibles d'implémentation, à toi de voir comment tu veux que tes clients appellent ta méthode
    Mon blog sur les technos .NET et Agile -> http://blog.developpez.com/maximepalmisano/

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

Discussions similaires

  1. Problème d'héritage ?
    Par Romanops dans le forum WinDev
    Réponses: 2
    Dernier message: 16/11/2005, 17h18
  2. Problème de raffraichissement de listes
    Par blondin01 dans le forum Access
    Réponses: 7
    Dernier message: 13/10/2005, 12h31
  3. Héritage et listes chainées...
    Par syntaxerror dans le forum C++
    Réponses: 7
    Dernier message: 04/05/2005, 20h18
  4. Problème d'héritage d'une méthode protégée
    Par shenron666 dans le forum C++
    Réponses: 9
    Dernier message: 28/04/2005, 23h17
  5. Problème pour positionner une liste déroulante
    Par ouckileou dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 30/09/2004, 01h05

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