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

Windows Forms Discussion :

Problème avec héritage et instanciation


Sujet :

Windows Forms

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2010
    Messages : 11
    Points : 6
    Points
    6
    Par défaut Problème avec héritage et instanciation
    Bonjour,

    J'ai un problème à mon travail avec l'héritage et l'instanciation de classe en C#.
    Voici donc la structure de code qui contient à la base 1 classe et 3 interface :

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace Exercice
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("Affiche le résulat dans la console");
            }
        }
    }
    
        interface IUser
        {
            string Name { get; set; }
    
            void AddContract(IContract contract);
    
        }    
    
        interface IContract
        {
            int ID { get; set; }
            string Description { get; set; }
            DateTime CreationDate { get; set; }
    
            void AddItem(IItem item);
            void RemoveItem(IItem item);
        }
    
        interface IItem
        {
            int ID { get; set; }
            string Description { get; set; }
        }
    J'ai créé 4 classes pour implémenter mes interfaces soit : User, Contract, Product et Service. Ensuite j'ai créé deux IList qui contiendront les contrats et les items.

    Donc après minte recherche, comment je fais pour ajouter des items dans ma liste d'item alors que les produits et services ont des variables différentes.

    Merci

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 46
    Points : 31
    Points
    31
    Par défaut
    Si je comprends bien, tu veux ajouter des produits et des services dans la même liste?

    Si c'est bien ça, il faut que tes deux interfaces IProduit et IService héritent d'une même interface (dans ton cas IItem).

    Dans ce cas ton implémentation avec une List<IItem> marchera.

  3. #3
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    400
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 400
    Points : 444
    Points
    444
    Par défaut
    Autre suggestion. N'est-il pas envisageable que ton interface IContract héritent de IItem ? Ainsi, IContract hériterait des deux propriétés de IItem, et tu n'aurais pas besoin de déclarer les propriétés dans ton interface IContract. Tu pourras ainsi ajouter des IItem dans une même List fortement typé.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2010
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par oyigit Voir le message
    Autre suggestion. N'est-il pas envisageable que ton interface IContract héritent de IItem ? Ainsi, IContract hériterait des deux propriétés de IItem, et tu n'aurais pas besoin de déclarer les propriétés dans ton interface IContract. Tu pourras ainsi ajouter des IItem dans une même List fortement typé.
    Bonjour,

    je comprends ton point de vue, mais corrige moi si je ne me trompe. Donc, même si j'implémente aussi l'interface IItem dans ma classe Contrat, ma liste reste toujours de type IItem qui ne contient pas de dateDebut et dateFin.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2010
    Messages : 11
    Points : 6
    Points
    6
    Par défaut Problème résolu
    Magnifique,

    j'ai résolu mon problème de la manière suivante :

    Tout d'abord j'ai inséré les éléments dans ma liste d'item peut importe le type(listItem.Add(item). Je me suis rendu compte que les données s'insérait correctement dans la liste mais le problème était lorsque je voulais les afficher.

    Lors de l'affichage, j'ai "Caster"(Désolé pour le terme mais je ne le trouvais pas en français) mes éléments de la liste dans le type que je voulais soit Product ou Service.

    Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //Affiche les items
            public void Display(IItem item)
            {
                if (item is Service)
                {
                    Service service = (Service)item;
                    Console.WriteLine("No: {0}\nDescription: {1}\nDate début: {2}\nDate fin: {3}\n",item.ID, item.Description, service.DateDebut, service.DateFin);
                }
                else
                {
                    Console.WriteLine("No: {0}\nDescription: {1}\n", item.ID, item.Description);
                }
            }
    Enfin, pour mon problème d'afficher tous les items de l'utilisateur j'ai fait 3 méthodes display qui s'appelle récursivement et qui affiche l'utilisateur, ces contrats et les items de ces contrats.

    Voici le code :
    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
    28
    29
    30
    //Affiche les utlisateurs
            public void Display(User user)
            { 
                Console.WriteLine("Utilisateur : {0}\n", user.Name);
                Console.WriteLine("****************** LISTE DES ITEMS ******************");
                foreach (Contract contract in user.Contract)
                    Display(contract);
     
            }
     
            //Affiche les contrats
            public void Display(Contract contract)
            {
                 foreach (IItem item in contract.Item)
                    Display(item);  
            }
     
            //Affiche les items
            public void Display(IItem item)
            {
                if (item is Service)
                {
                    Service service = (Service)item;
                    Console.WriteLine("No: {0}\nDescription: {1}\nDate début: {2}\nDate fin: {3}\n",item.ID, item.Description, service.DateDebut, service.DateFin);
                }
                else
                {
                    Console.WriteLine("No: {0}\nDescription: {1}\n", item.ID, item.Description);
                }
            }
    Bref, problème résolu !!

    Merci à tous pour votre aide précieuse qui m'a permis de comprendre

  6. #6
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Une solution plus simple aurait été d'avoir une propriété "Description" dans ton interface IItem. concrètement :
    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
    interface IItem
    {
     ...
     string Description {get; }
    }
     
    class service : IItem
    {
      ...
      public string Description { get { return string.Format(
        "No: {0}\nDescription: {1}\nDate début: {2}\nDate fin: {3}\n",
        this.ID, this.Description, this.DateDebut, this.DateFin); } }
    }
     
    // pareil pour les autres classes implémentant IItem
    Du coup, t'as plus besoin d'utiliser l'opérateur "is", parce que pour l'instant, tu as beau avoir des méthodes qui prennent des interfaces en paramètre, elles doivent connaître les types concrets.
    ಠ_ಠ

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

Discussions similaires

  1. problème avec héritage jpa+spring
    Par info20111 dans le forum Spring
    Réponses: 0
    Dernier message: 03/06/2013, 11h16
  2. [C#]Héritage d'un DataGridView, problème avec le designer
    Par Pilloutou dans le forum Windows Forms
    Réponses: 18
    Dernier message: 29/02/2012, 08h21
  3. Problème avec héritage
    Par shadeoner dans le forum Débuter
    Réponses: 2
    Dernier message: 07/07/2011, 11h48
  4. [VC++] Problème avec un héritage
    Par Freakazoid dans le forum Visual C++
    Réponses: 7
    Dernier message: 28/11/2005, 08h35
  5. [DEBUTANT] Probléme avec l'héritage
    Par BRAUKRIS dans le forum Langage
    Réponses: 7
    Dernier message: 16/09/2005, 20h22

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