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

Design Patterns Discussion :

Intérêt de l'héritage multiple


Sujet :

Design Patterns

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 17
    Points : 11
    Points
    11
    Par défaut Intérêt de l'héritage multiple
    Bonjour,

    Je voudrais savoir quel est réellement l'intérêt de l'héritage multiple en c++ ? (je demande pas forcément d'exemples concrets, mais grosso modo, dans quel cas il est utile) car j'y vois surtout beaucoup d'inconvénients

    merci

    Nicolas

  2. #2
    Membre chevronné
    Avatar de Anthony.Desvernois
    Homme Profil pro
    Ingénieur sécurité & risque
    Inscrit en
    Juin 2007
    Messages
    1 489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur sécurité & risque
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 489
    Points : 2 244
    Points
    2 244
    Par défaut
    Bonjour,

    Un exemple concret et simple. Omnivore: c'est un carnivore et un herbivore.
    "Voyager, c'est découvrir que tout le monde a tort", Aldous Huxley
    "Less is more" Ludwig Mies Van Der Rohe

    Risk & Security Mgmt

  3. #3
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Citation Envoyé par Anthony.Desvernois Voir le message
    Un exemple concret et simple. Omnivore: c'est un carnivore et un herbivore.
    Tu peux donner des détails quand à ce qu'est un Carnivore/Herbivore ?
    En général, on peut toujours éviter l'héritage multiple de classe non virtuelle pure.

    Je voudrais savoir quel est réellement l'intérêt de l'héritage multiple en c++ ? (je demande pas forcément d'exemples concrets, mais grosso modo, dans quel cas il est utile) car j'y vois surtout beaucoup d'inconvénients
    L'héritage privé peut résoudre des problèmes quand à la manière d'allouer la mémoire (on peut éviter de passer par des new et des delete sur un attribut en faisant un héritage privé de celui ci)... mais bon.

    Faire un héritage multiple publique de plusieurs classes non virtuel pur, je trouve qu'en général, c'est pas le bon plan.
    Je ne répondrai à aucune question technique en privé

  4. #4
    Membre chevronné
    Avatar de Anthony.Desvernois
    Homme Profil pro
    Ingénieur sécurité & risque
    Inscrit en
    Juin 2007
    Messages
    1 489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur sécurité & risque
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 489
    Points : 2 244
    Points
    2 244
    Par défaut
    Citation Envoyé par millie Voir le message
    Tu peux donner des détails quand à ce qu'est un Carnivore/Herbivore ?
    Des espèces qui mangent de la viande et des espèces qui mangent des végétaux Dans le cadre d'un jeu par exemple, ça a un sens.

    Après, bien évidemment, tu peux coder une liste avec les régimes alimentaires ... mais bon. C'est sympa aussi de pouvoir hériter du régime alimentaires des deux
    "Voyager, c'est découvrir que tout le monde a tort", Aldous Huxley
    "Less is more" Ludwig Mies Van Der Rohe

    Risk & Security Mgmt

  5. #5
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Citation Envoyé par Anthony.Desvernois Voir le message
    Après, bien évidemment, tu peux coder une liste avec les régimes alimentaires ... mais bon. C'est sympa aussi de pouvoir hériter du régime alimentaires des deux
    Oui, mais comment fais-tu cela ?

    Moi, je vois un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    interface Mangeur {
      bool accepterManger();
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Carnivore : Mangeur {
      bool accepterManger(manger) {
        si(manger==VIANDE) == true retourner true sinon retourne false;
      } 
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Vegetarien : Mangeur {
      bool accepterManger(manger) {
        si(manger==vegetal || manger==oeuf...) == true retourner true sinon retourne false;
      } 
    }
    Tu fais comment ton héritage ?

    Parce que par définition de l'omnivore (omni voulant dire tout), je vois surtout :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Omnivore : Mangeur {
      bool accepterManger(manger) {
        retourner true;
      }
    }
    Je ne répondrai à aucune question technique en privé

  6. #6
    Membre habitué
    Inscrit en
    Septembre 2008
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 234
    Points : 156
    Points
    156
    Par défaut
    Citation Envoyé par millie Voir le message
    Tu peux donner des détails quand à ce qu'est un Carnivore/Herbivore ?
    Bonsoir,

    En java, l'héritage multiple n'est pas possible mais on utilise des interfaces à des fins similaires.

    Mais, au delà de ca, les designs patterns offrent une solution à ce genre de problème. Il suffit d'avoir une classe qui reprends le comportement au niveau des habitudes alimentaires et d'avoir une référence dans la classe animal. C'est dans le même ordre d'idée que la représentation d'un état.
    Développeur en devenir.

    A la recherche de toute source approfondissant Merise, UML, Java, l'objet, les design patterns hors GOF et le développement en général.

    Recherche également des informations sur les techniques de développement et les bonnes pratiques en terme de programmation en entreprise.

    "On en apprends beaucoup plus par la confrontation que par la conciliation"

  7. #7
    Membre chevronné
    Avatar de Anthony.Desvernois
    Homme Profil pro
    Ingénieur sécurité & risque
    Inscrit en
    Juin 2007
    Messages
    1 489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur sécurité & risque
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 489
    Points : 2 244
    Points
    2 244
    Par défaut
    En fait je pensais plutôt à un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    si bestiole^est-un(Carnivore) alors { cours-forest-cours } fin-si
    "Voyager, c'est découvrir que tout le monde a tort", Aldous Huxley
    "Less is more" Ludwig Mies Van Der Rohe

    Risk & Security Mgmt

  8. #8
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Citation Envoyé par Anthony.Desvernois Voir le message
    En fait je pensais plutôt à un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    si bestiole^est-un(Carnivore) alors { cours-forest-cours } fin-si
    Utiliser des est-un en Conception Orienté Objet (instance of en java), en général, c'est mal.
    Je ne répondrai à aucune question technique en privé

  9. #9
    Membre habitué
    Inscrit en
    Septembre 2008
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 234
    Points : 156
    Points
    156
    Par défaut
    L'approche état/behaviour (voir headfirst design patterns). Ma mémoire est floue mais je pense qu'il s'agit de la délégation.

    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
    78
    79
    80
    81
    82
    83
    public abstract class HabitudesAlimentaires {
      public bool accepterManger(manger) {
      }
    }
    
    public class Carnivore extends HabitudesAlimentaires {
    
     public Carnivore()
      {
     }
    
      public bool accepterManger(manger) {
        if( manger==VIANDE )
         return true
       else return false;
      }
    }
    
    public class Vegetarien extends HabitudesAlimentaires {
    
     public Vegetarien()
     {
     }
    
      public bool accepterManger(manger) {
        if(manger==vegetal || manger==oeuf) == true
         return true
       else return false;
      }
    }
    
    public class Omnivore extends HabitudesAlimentaires {
    
     public Carnivore()
     {
     }
    
      public bool accepterManger(manger) {
        if( manger==VIANDE && ( manger==vegetal || manger==oeuf ) )
         return true
       else return false;
      }
    }
    
    public class Animal {
     private HabitudesAlimentaires ha = null;
    
     public Animal()
     {
     }
    
     public void accepterManger() {
        ha.accepterManger();
      }
    
     public void setHab( HabitudesAlimentaires instanceHab )
     {
      this.ha = instanceHab;
     }
    
     public HabitudesAlimentaires void getHab()
     {
       return ha;
     }
    }
    
    public class Test {
      public static void main(String[] args)
     {
      Animal unAnimal;
      HabitudesAlimentaires ha;
     bool testManger;
    
      unAnimal = new Animal();
      ha = new Carnivore();
    
      unAnimal.setHab( ha );
    
      testManger = unAnimal.getHab().accepterManger( "VIANDE" );
    
      System.out.println( "Accepte la viande :" + ( testManger ? "oui" : "non" ) );
     }
    }
    Développeur en devenir.

    A la recherche de toute source approfondissant Merise, UML, Java, l'objet, les design patterns hors GOF et le développement en général.

    Recherche également des informations sur les techniques de développement et les bonnes pratiques en terme de programmation en entreprise.

    "On en apprends beaucoup plus par la confrontation que par la conciliation"

  10. #10
    Membre émérite
    Homme Profil pro
    Développeur Java/Scala
    Inscrit en
    Octobre 2007
    Messages
    1 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Scala

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 086
    Points : 2 271
    Points
    2 271
    Par défaut
    Heu... ????


    public Animal()
    {
    ha = HabitudesAlimentaires();
    }


    Ca c'est possible d'instancier une classe abstraite ? :O Jcomprends plus rien la ^^
    React-Hebdo - Newsletter pour se tenir à jour sur l'écosystème React

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 280
    Points : 344
    Points
    344
    Par défaut
    Citation Envoyé par millie Voir le message
    Utiliser des est-un en Conception Orienté Objet (instance of en java), en général, c'est mal.
    Salut,
    Pourquoi donc ?
    c'est peut etre pas aussi performant que d'implementer un getType() (par example) et comparer le resultat a un entier ou enum ou autre...
    Mais je vois pas en quoi c'est mal ?

    ---
    Farid

  12. #12
    Membre habitué
    Inscrit en
    Septembre 2008
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 234
    Points : 156
    Points
    156
    Par défaut
    Citation Envoyé par HerQuLe Voir le message
    Ca c'est possible d'instancier une classe abstraite ? :O Jcomprends plus rien la ^^
    Grosse connerie de ma part en effet. J'étais surement en train de réflêchir au fait qu'il faudrais une classe parent comme attribut et je me suis surement emmêlé les pinceaux. En effet, il ne devrais pas y avoir d'instantiation dans le classe Animal et le compilateur m'aurais "gueulé" dessus pour avoir essayé d'instantier une classe abstraite :p . Mais bon, le principe reste valable. Dans ce cas de figure, l'héritage multiple aurais donc un intérêt réduit.

    Ceci dis il parais tout de même plus intuitif. Par exemple, comment représenter le fait qu'une créature bénéficie du code génétique de ces parents respectifs ? On pourrais avoir deux références mais si une espèce extraterrestre avec a plus de deux donateurs fais son apparition, le modèle est fichu (ou alors on introduit une Liste). A la place on auras plusieurs héritages.
    Développeur en devenir.

    A la recherche de toute source approfondissant Merise, UML, Java, l'objet, les design patterns hors GOF et le développement en général.

    Recherche également des informations sur les techniques de développement et les bonnes pratiques en terme de programmation en entreprise.

    "On en apprends beaucoup plus par la confrontation que par la conciliation"

  13. #13
    Membre chevronné
    Avatar de Anthony.Desvernois
    Homme Profil pro
    Ingénieur sécurité & risque
    Inscrit en
    Juin 2007
    Messages
    1 489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur sécurité & risque
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 489
    Points : 2 244
    Points
    2 244
    Par défaut
    Citation Envoyé par millie Voir le message
    Utiliser des est-un en Conception Orienté Objet (instance of en java), en général, c'est mal.
    Ah ? Pourquoi ?
    "Voyager, c'est découvrir que tout le monde a tort", Aldous Huxley
    "Less is more" Ludwig Mies Van Der Rohe

    Risk & Security Mgmt

  14. #14
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Citation Envoyé par Anthony.Desvernois Voir le message
    Ah ? Pourquoi ?
    L'interêt du polymorphisme étant de rendre transparent le vrai type d'un objet qui par exemple est utilisé en tant qu'interface dans une fonction.


    Si tu manipules un objet de type Animal, mais que tu dois faire des switch case suivant son type réel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void fonction(Animal a) {
     if(a instance of Chien) {
       ecrire("Wouf");
     if(a instance of Chat) {
       ecrire("Miaou");
    }
    On brise l'interêt du polymorphisme, ça peut amener des problèmes de maintenances.

    Si j'ajoutes une classe Cerf, il y a de grandes possibilités que j'oublis d'ajouter le switch case dans les fonctions qui utilisent un instance of alors qu'il suffirait d'écrire une méthode : parler().


    Pour ton exemple, c'est un peu pareil, il faudrait plutôt faire :
    if(animal.mange(POULET)) then run forest.
    On peut imaginer qu'il y ait des animaux qui ne mangent que de la viande ou du poulet sans manger du poisson (donc qui ne sont finalement pas complètement Carnivore), et ça risque d'ajouter un bug si tu ajoutes une sous-classe particulière qui ne mange que du poulet, qui n'est pas un carnivore et qui devrait être compris dans le if then run forest.



    Je n'ai pas dit qu'il ne fallait jamais l'utiliser, mais que dans 95% des cas (voir plus), il y a une méthode plus propre et plus évolutive.
    Je ne répondrai à aucune question technique en privé

  15. #15
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Citation Envoyé par Jimalexp Voir le message

    En java, l'héritage multiple n'est pas possible mais on utilise des interfaces à des fins similaires.
    Ce n'est pas vraiment la même chose. Les interfaces Java se rapproche plus des classes abstraites composées uniquement de méthodes virtuelles pures comme en c++ que de l'héritage multiple. En fait c'est une composition de l'héritage multiple et des méthodes virtuelles pures.


    c'est peut etre pas aussi performant que d'implementer un getType() (par example) et comparer le resultat a un entier ou enum ou autre...
    Mais je vois pas en quoi c'est mal ?
    Mais, au delà de ca, les designs patterns offrent une solution à ce genre de problème.
    C'est le polymorphisme qui règle ce problème de dépendances de types cela permet aussi de protéger les variations(encore un autre pattern). Les if est-quelque-chose n'a donc que très peu de raison d'être utilisé.

    Le code de milie montre aussi qu'on brise le principe de conception ouvert(aux extensions)/fermé(aux modifications)
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 280
    Points : 344
    Points
    344
    Par défaut
    Merci pour l'illustration, je trouvais dommage d'ecrire une telle affirmation sans explication...

    Il est tout a fait vrai qu'il faut eviter autant que possible les instanceof car cela donne tres facilement de beaux effets de bords, et la c'est le scaphandre assure avec la boite d'aspirine pour la longue seance de debug...

    Mais dans de rare situation c'est une belle roue de secours...

    ---
    Farid.

  17. #17
    Membre habitué
    Inscrit en
    Septembre 2008
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 234
    Points : 156
    Points
    156
    Par défaut
    Citation Envoyé par Farid_92 Voir le message
    Il est tout a fait vrai qu'il faut eviter autant que possible les instanceof car cela donne tres facilement de beaux effets de bords
    Qu'entends-tu par effet de bord ?
    Développeur en devenir.

    A la recherche de toute source approfondissant Merise, UML, Java, l'objet, les design patterns hors GOF et le développement en général.

    Recherche également des informations sur les techniques de développement et les bonnes pratiques en terme de programmation en entreprise.

    "On en apprends beaucoup plus par la confrontation que par la conciliation"

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 280
    Points : 344
    Points
    344
    Par défaut
    voici un exemple d'effet de bords http://fr.wikipedia.org/wiki/Effet_d...(informatique).

    De maniere generique tu veux aller de A vers B, mais tu te retrouves en C, car a un croissement tu as pris une route qui ressemblait a celle de menant a B.


    ---
    Farid.

  19. #19
    Expert confirmé
    Avatar de Hephaistos007
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2004
    Messages
    2 493
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 493
    Points : 4 166
    Points
    4 166
    Par défaut
    Citation Envoyé par millie Voir le message
    L'interêt du polymorphisme étant de rendre transparent le vrai type d'un objet qui par exemple est utilisé en tant qu'interface dans une fonction.
    +1000

    De plus, ce genre de mécanisme utilise le niveau méta, qui n'est absolument pas intrinsèque au paradigme objet; le polymorphisme, oui ...
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes --- devise SHADOKS

    Kit de survie Android : mon guide pour apprendre à programmer sur Android, mon tutoriel sur les web services et enfin l'outil en ligne pour vous faire gagner du temps - N'oubliez pas de consulter la FAQ Android

  20. #20
    Membre émérite
    Avatar de SpiceGuid
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 704
    Points : 2 990
    Points
    2 990
    Par défaut
    Citation Envoyé par Kyle128
    Je voudrais savoir quel est réellement l'intérêt de l'héritage multiple en c++ ? (je demande pas forcément d'exemples concrets, mais grosso modo, dans quel cas il est utile) car j'y vois surtout beaucoup d'inconvénients
    Les 'inconvénients' qu'on t'a donnés à voir reflètent plus un point de vue sur C++ qu'un point de vue sur l'héritage multiple en général.

    Si tu veux une présentation plus optimiste de l'héritage multiple il faut s'ouvrir à d'autres langages et regarder du côté de Eiffel par exemple, où l'héritage multiple est bien mieux traité qu'en C++.
    Du même auteur: mon projet, le dernier article publié, le blog dvp et le jeu vidéo.
    Avant de poser une question je lis les règles du forum.

Discussions similaires

  1. composants C++ Builder et héritage multiple
    Par vedrfolnir dans le forum C++Builder
    Réponses: 2
    Dernier message: 12/10/2005, 10h04
  2. [heritage][conception]héritage multiple en java!
    Par soulhouf dans le forum Langage
    Réponses: 9
    Dernier message: 25/08/2005, 20h03
  3. L'héritage multiple est-il possible en Delphi ?
    Par SchpatziBreizh dans le forum Langage
    Réponses: 8
    Dernier message: 30/06/2005, 11h30
  4. utilisez vous l'héritage multiple ?
    Par vodosiossbaas dans le forum C++
    Réponses: 8
    Dernier message: 13/06/2005, 20h25
  5. [XML Schemas]héritage multiple
    Par nicolas_jf dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 10/06/2003, 12h55

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