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 :

Polymorphisme et héritage


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 10
    Par défaut Polymorphisme et héritage
    Bonjour à tous, je vous remercie d'avance pour lire ma question.

    Mon problème est assez simple. J'ai un tableau d'instances de ma classe parents.

    Je souhaite redéfinir ces instances dynamiquement avec un type de la classe fille.

    Je vous donne un code exemple pour que ce soit plus simple :

    La définition de mes classes. Les classes filles ont un construteur à partir d'une instance de la classe parente.
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    public interface IDisplay
        {
            void Display();
        }        
     
        public class ClassParent : IDisplay
        {
            public int iParent;
     
            public ClassParent()
            {
            }
     
            public ClassParent(int i)
            {
                iParent = i;
            }
     
            public ClassParent(ClassParent cP)
            {
                this.iParent = cP.iParent;
            }
     
            public virtual void Display()
            {
                Console.WriteLine("Mere: " + iParent.ToString());
                Console.WriteLine("");
            }
        }
     
        public class ClassFillePetite : ClassParent
        {
            public int iFilleInt;
     
            public ClassFillePetite()
            {
                Random rdm = new Random(iParent);
                iFilleInt = (int)(rdm.NextDouble() * 10);
            }
     
            public ClassFillePetite(ClassParent m)
                : base(m)
            {
                Random rdm = new Random(m.iParent);
                iFilleInt = (int)(rdm.NextDouble() * 10);
            }
     
            public override void Display()
            {
                Console.WriteLine("FillePetite: " + iParent.ToString() + " " + iFilleInt.ToString());
                Console.WriteLine("");
            }
        }
     
        public class ClassFilleGrande : ClassParent
        {
            public double iFilleDouble;
     
            public ClassFilleGrande()
            {
                Random rdm = new Random(iParent);
                iFilleDouble = (rdm.NextDouble() * 10);
            }
     
            public ClassFilleGrande(ClassParent m)
                : base(m)
            {
                Random rdm = new Random(m.iParent);
                iFilleDouble = (rdm.NextDouble() * 10);
            }
     
            public override void Display()
            {
                Console.WriteLine("FilleGrande: " + iParent.ToString() + " " + iFilleDouble.ToString());
                Console.WriteLine("");
            }
        }
    Voilà mon main :
    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
    static void Main(string[] args)
            {
                ClassParent[] listMere = new ClassParent[5];
     
                // Création d'un tableau de parents
                listMere[0] = new ClassParent(10);
                listMere[1] = new ClassParent(1);
                listMere[2] = new ClassParent(4);
                listMere[3] = new ClassParent(7);
                listMere[4] = new ClassParent(2);
     
                for(int i=0; i<5; i++)
                {
                    if (listMere[i].iParent < 5)
                    {
                        listMere[i] = new ClassFillePetite(listMere[i]);
                    }
                    else
                    {
                        listMere[i] = new ClassFilleGrande(listMere[i]);
                    }
                }
     
                for (int i = 0; i < 5; i++)
                {
                    listMere[i].Display();
                }
    Je voudrais savoir si la méthode utilisée est correcte et vos avis, merci !

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Par défaut
    Syntaxiquement juste, logiquement moins.

    En effet un parent possède n enfants, un enfant n'étant pas forcément un parent (il le sera plus tard peut-être). Il faut se méfier de vouloir faire de l'héritage dans tous sens, et bien se poser la question de ce que sont les données !

    Exemple simple d'héritage : un employé, qui peut être technicien, cadre ou secrétaire...

  3. #3
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 10
    Par défaut
    Merci pour ta réponse rapide.

    J'ai fournit un exemple ne justifiant pas forcément l'utilisation de l'héritage.

    Je suis plus intéressé par la syntaxe.

    Comment déclaré une instance d'une classe parente en une classe fille ?
    Utilisé un constructeur par recopie à partir de la classe mère est correcte ?

  4. #4
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Par défaut
    Cloner une instance est à réserver pour des cas précis, où on a besoin de travailler sur des références distinctes, sinon passer directement le membre par constructeur ou par propriété suffit...

  5. #5
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 10
    Par défaut
    En fait je ne cherche pas à le cloner ni à travailler sur des références distinctes.

    J'ai un objet de type "ClassParent" et je veux qu'il devienne de type "ClassFille".

  6. #6
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Par défaut
    1. Encapsulation
    2. Définition de 2 interfaces différentes, une classe implémentant ces interfaces, et tu retournes l'objet casté en Interface1 ou Interface2.
    3. héritage comme tu le fais, mais il faut que ça reste logique (j'insiste)

    Si tu parlais de ton problème/besoin on pourrait mieux cibler la réponse.

    Edit : et si on reprend ton tableau de classe Parent, et que tu cherches à les recaster dans leur type de base :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ClasseFille fille = classeParent[i] as ClasseFille;
     
    if(fille != null){ /* C'est une fille */}
    is permet de tester si un élément est bien une instance d'une classe (renvoie un bool

  7. #7
    Membre émérite
    Avatar de Gurdil le nain
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2009
    Messages
    468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 468
    Par défaut
    Il faut que tu fasses un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ClasseParent maVariable = new ClasseFille();
    Le cast d'un objet "mère" en un objet "fille" est impossible, alors que l'inverse est possible (et c'est là tout le principe de l'héritage)

Discussions similaires

  1. Le polymorphisme d'héritage
    Par Tsuna dans le forum Débuter
    Réponses: 3
    Dernier message: 06/08/2013, 01h20
  2. Réponses: 10
    Dernier message: 15/04/2013, 18h43
  3. Polymorphisme et héritage en Java
    Par mooie dans le forum Général Java
    Réponses: 3
    Dernier message: 06/12/2012, 18h43
  4. polymorphisme et héritage
    Par gelomaak dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 11/12/2008, 00h16
  5. polymorphisme d' héritage
    Par loacast dans le forum C++
    Réponses: 3
    Dernier message: 30/01/2007, 11h13

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