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 :

héritages de listes et conversion


Sujet :

C#

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 5
    Points : 5
    Points
    5
    Par défaut héritages de listes et conversion
    Bonjour à tous,

    j'ai une question concernant des héritages de listes.

    J'ai une classe de base
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public class Fruit
    {
    }
    et des classes qui en héritent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class :Fruit
    {
    public int NumeroBanane{get;set;}
    }
    public class Ananas:Fruit
    {
    }
    public class Fraise:Fruit
    {
    }
    etc....

    Et j'ai des listes de mes classes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public BananeList:List<Fruit>
    {
    }
    public class AnanasList:List<Ananas>
    {
    }
    etc...

    maintenant j'ai une autre classe qui contient une list<fruit>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public class GardeManger
    {
     public List<Fruit> listeFruit;
    }
    J'essaie d'affecter une list de banane à ma propriété listeFruit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    private void Form1_Load(object sender, EventArgs e)
    {
    BananeList bananaList=new BananeList();
    bananaList.Add(new Banane(){NumeroBanane=1});
    bananaList.Add(new Banane(){NumeroBanane=2});
    bananaList.Add(new Banane(){NumeroBanane=3});
     
    GardeManger monGardeManger=new GardeManger();
    monGardeManger.listeFruit=bananaList;
    }
    Et là j'ai une erreur à la compil "Impossible de convertir implicitement le type 'BananeList' en 'List<Fruit>'. Et pouratnt BananeList est une List<Fruit>.
    Une explication SVP. Et comment puis-je faire pour remèdier à ce problème.

    MErci d'avance.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonjour,
    Si j'ai bien compris, une BananeList est une List<Banane> et non pas une List<Fruit>. Donc l'affectation n'est pas possible.
    Pourquoi ne pas ajouter les Bananes directement dans la liste de fruits du garde manger (heu c'est bien un forum de dev ? ) plutôt que de passer par une affectation de la liste ?

  3. #3
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    une liste de bananes N'EST PAS (point de vue héritage) une liste de fruit.
    Il existe un lien entre banane et fruit donc on a bien la relation: Banane EST UN Fruit
    mais il n'existe aucun lien entre List<Banane> et List<Fruit> ; ce sont justes 2 types de listes à aucun moment on n'a dit que List<Banane> héritait de List<Fruit>

    Dit autrement on peut mettre une banane de List<Banane> dans List<Fruit> parce que Banane EST UN Fruit, mais on ne peut substituer l'ensemble de la collection.

    Ainsi pour y remédier, tu peux te faire, par exemple, une méthode Ajouter dans GardeManger qui prend en paramètre un fruit et l'ajoute à la liste du garde manger ; ainsi que tu passes une banane ou un ananas peu importe
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )
    À quelle heure dormez-vous ?
    Censément, quelqu'un de sensé est censé s'exprimer sensément.

  4. #4
    Futur Membre du Club
    Inscrit en
    Mai 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Merci pour vos réponses. C'est un peu plus clair.
    Le fait de mettre une banane ou un ananas dans mon garde manger fonctionne bien, mais ça ne convient pas à mon idée initiale :
    En effet je souhaite utiliser chaque liste pour faire du binding pour une datagridView:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    BananeList bananaList=new BananeList();
    bananaList.Add(new Banane(){NumeroBanane=1});
    bananaList.Add(new Banane(){NumeroBanane=2});
    bananaList.Add(new Banane(){NumeroBanane=3});
     
    BindingSource maBindingSource=new BindingSource();
    maBindingSource.Datasource=bananaList;
    maDatagrid.DataSource=maBindingSource;
    Là ça fonctionne nickel, mais j'ai mon problème initial (impossible d'affecter chaque liste à mon gardemanger)

    par contre si je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    GardeManger monGardeManger=new GardeManger()
    monGardeManger.Add(new Banane(){NumeroBanane=1});
    monGardeManger.Add(new Banane(){NumeroBanane=2});
    monGardeManger.Add(new Banane(){NumeroBanane=3});
     
    BindingSource maBindingSource=new BindingSource();
    maBindingSource.Datasource=monGardeManger;
    maDatagrid.DataSource=maBindingSource;
    Là apparaît le bon nombre de ligne (3), mais je n'ai aucune donnée dans mes cellules. Une idée ??? Sachant qu'à chaque fois que je vais utiliser le BindingSource pour le datagridView, ça ne sera qu'un type de fruit précis.

    Merci pour votre aide

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    332
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2002
    Messages : 332
    Points : 502
    Points
    502
    Par défaut
    As-tu vraiment besoin de faire de l'héritage ou bien c'est simplement pour généraliser tes listes? Si c'est le cas, vas-y par composition.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        <Grid>
            <DataGrid Name="DataGrid1" AutoGenerateColumns="True" HorizontalAlignment="Left" Margin="161,125,0,0" VerticalAlignment="Top" Height="77" Width="148" DataContext="{Binding}"/>
     
        </Grid>
    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
    22
    23
    24
    25
    26
    27
     
        public partial class MainWindow : Window
        {
            public interface IFruit
            {
                string Nom { get; set; }
            }
     
            public class Banane : IFruit
            {
                public string Nom { get; set; }
            }
     
            public class Ananas : IFruit
            {
                public string Nom { get; set; }
            }
     
            public MainWindow()
            {
                InitializeComponent();
     
                var mesFruits = new List<IFruit> {new Banane {Nom = "Ma banane"}, new Ananas {Nom = "Mon ananas"}};
     
                DataGrid1.ItemsSource = mesFruits;
            }
        }
    Nom : Developpez.jpg
Affichages : 66
Taille : 12,9 Ko

Discussions similaires

  1. Héritage et liste
    Par Flaburgan dans le forum C#
    Réponses: 12
    Dernier message: 06/04/2011, 13h22
  2. Héritage et List
    Par Benoit_T dans le forum Langage
    Réponses: 3
    Dernier message: 11/08/2010, 11h42
  3. Héritage et liste variable d'arguments
    Par jimaitou dans le forum Débuter
    Réponses: 9
    Dernier message: 08/03/2009, 19h52
  4. empecher héritage dans liste à puce imbriquées
    Par zamanika dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 15/03/2007, 15h18
  5. Héritage et listes chainées...
    Par syntaxerror dans le forum C++
    Réponses: 7
    Dernier message: 04/05/2005, 20h18

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