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#

  1. #1
    Futur Membre du Club
    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
    Points : 5
    Points
    5
    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 émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    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
    Points : 2 331
    Points
    2 331
    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
    Futur Membre du Club
    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
    Points : 5
    Points
    5
    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 émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    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
    Points : 2 331
    Points
    2 331
    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
    Futur Membre du Club
    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
    Points : 5
    Points
    5
    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 émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    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
    Points : 2 331
    Points
    2 331
    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 éprouvé
    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
    Points : 1 111
    Points
    1 111
    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)

  8. #8
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    Un objet de Type A ne deviendra jamais un objet de type B...

    Une fois un objet crée, il ne peut changer de type...

    Tu peux juste, avec l'héritage ou les interfaces autoriser cet objet à être vu comme d'un type "hérité" ou implémentant une interface... mais en aucun cas,
    A changera de type pour devenir B.

    Après, au niveau du langage C#, on peut s'appuyer sur les conversions "implicit" pour faciliter l'écriture d'un code pouvant écrire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    A objA = new A();
    B = A;
    A condition que A "implémente" la conversion implicite en B...

    J'aurais tendance à dire que si on connaissait le contexte dans lequel tu es amené à faire une telle demande, nous pourrions peut-etre davantage t'orienter vers une solution.
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  9. #9
    Futur Membre du Club
    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
    Points : 5
    Points
    5
    Par défaut
    Mes objets sont remplis via des requêtes SQL. Je cherche donc à minimiser le nombre de requêtes pour alourdir la charge sur le serveur SQL.

    Je construis un tableau de 50k objets de la classe Parent (via une seule requête SQL). Ce sont les propriétés communes à tous mes objets

    Je veux ensuite distinguer ces objets en différents groupes avec des comportement/propriétés propres.
    J'ai donc besoin de les caster dans la classe fille et d'aller récupérer via une requête SQL les propriétés propres à la classe fille.

    J'espère avoir réussi à exposer mon problème clairement et simplement. Je vous remercie du temps passé à me répondre

  10. #10
    Membre éprouvé
    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
    Points : 1 111
    Points
    1 111
    Par défaut
    C'est impossible directement...

    Si tu veux continuer avec un héritage, il faut que tu créé tes classes mères avec les réponses de ta requête, et qu'ensuite tu recréé par dessus tes objets classes filles en leur filant les attributs de la classe mère et en plus les résultat de ta nouvelle requête...mais ça va être super lourd ^^

  11. #11
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    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
    Points : 2 331
    Points
    2 331
    Par défaut
    Si ta volonté est de limiter les accès bdd, pourquoi ne pas faire une requête avec un left join pour les propriétés filles, renvoyant null si rien n'est trouvé ?

    As-tu une seule ou plusieurs classes filles ?

  12. #12
    Futur Membre du Club
    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
    Points : 5
    Points
    5
    Par défaut
    J'ai une dizaine de classes filles différentes.
    La requête SQL est déjà compliquée et je ne souhaite pas la compliquer encore plus.

    Je pense que je ne vais pas créer d'objet de la classe parent. Je vais déterminer au plus tôt la classe de l'objet et créer directement un objet de la classe fille.

    Je vous remercie pour vos réponses

  13. #13
    Membre éclairé
    Homme Profil pro
    Développeur / architecte
    Inscrit en
    Juillet 2009
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur / architecte

    Informations forums :
    Inscription : Juillet 2009
    Messages : 473
    Points : 674
    Points
    674
    Par défaut
    Citation Envoyé par samlesu Voir le message
    Je construis un tableau de 50k objets de la classe Parent (via une seule requête SQL). Ce sont les propriétés communes à tous mes objets

    Je veux ensuite distinguer ces objets en différents groupes avec des comportement/propriétés propres.
    J'ai donc besoin de les caster dans la classe fille et d'aller récupérer via une requête SQL les propriétés propres à la classe fille.
    Ca serait pas du lazy loading que tu essaie de faire ? Du chargement à la demande ?
    En gros l'idée c'est que tu charges une description limitée de chaque objet et ensuite lorsque l'utilisateur le sollicite dans l'interface, chargement de toutes les données de l'objet en question ?

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