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

Langage C++ Discussion :

Interfaces et implémentations croisées


Sujet :

Langage C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 15
    Points : 9
    Points
    9
    Par défaut Interfaces et implémentations croisées
    Bonjour à tous et bonne année 2012!

    Je souhaite créer une classe qui dérive de 2 autres classes. Je pensais pourvoir en considérer une comme une classe d interface et l'autre comme une classe d'implémentation, mais j'ai l impression que je vais devoir croiser un peu les 2 vu comment elles sont faites... J'ai une impression du coup de conception un peu tordue et pas claire. Quels sont vos conseils?
    Est ce que créer 2 nouvelles classes avec d un cote toutes les fonctions d interface et de l autre toutes les fonctions d implementation des 2 classes parentes puis ensuite rederiver vous semble t il correct?

    Merci pour vos réponses!

  2. #2
    Membre éclairé Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Points : 790
    Points
    790
    Par défaut
    AMHO, le plus simple est de créer une classe de base interface, puis de créer pour chaque implémentation une classe qui dérive de l'interface et qui l'implémente.

  3. #3
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 626
    Points : 30 684
    Points
    30 684
    Par défaut
    salut,

    Sans savoir ce que font les deux classes dont il est question, il sera malheureusement difficile de répondre

    Mais il faut se rappeler que ce qui est vrai avec l'héritage simple l'est d'autant plus avec l'héritage multiple : l'héritage est la relation la plus forte qui puisse exister entre deux classes, et il faut donc l'envisager avec la plus extrême prudence!!!

    Il faut absolument éviter le piège qui consiste à faire dériver une classe d'une autre si le seul but est en réalité de récupérer une interface alors que l'on ne peut pas décemment considérer que la classe dérivée EST UNE classe de base du point de vue sémantique, cad si tu ne peut pas effectivement considérer que, tu ne peut pas faire passer un objet du type de la classe dérivée comme étant un objet du type de la classe de base! (cf principe de substitution de Liskov).

    Dans bien des cas, la composition sera surement plus intéressante que l'héritage, et c'est d'autant plus vrai lorsque l'on envisage de recourir à l'héritage multiple

    L'héritage multiple est, en effet, une des possibilités offertes par le C++ qui peut très rapidement apporter un lot de problèmes considérables, du au fait que l'héritage simple doit déjà être envisagé avec la plus grande sagesse, mais aussi parce qu'il arrive avec un certain nombre de problèmes supplémentaires, comme le risque de se retrouver face à un "losange de la mort" (une classe qui hérite de deux autres qui dérivent elles-mêmes d'une seule classe ancêtre)

    Je ne dis pas que tu dois renoncer à l'héritage multiple, mais, à défaut de savoir exactement la situation dans laquelle tu envisage d'y recourir, le seul fait que tu te pose la question de savoir s'il n'est pas préférable de faire autrement semble clairement indiquer qu'il vaut sans doute en effet mieux faire autrement
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Il faut absolument éviter le piège qui consiste à faire dériver une classe d'une autre si le seul but est en réalité de récupérer une interface alors que l'on ne peut pas décemment considérer que la classe dérivée EST UNE classe de base du point de vue sémantique, cad si tu ne peut pas effectivement considérer que, tu ne peut pas faire passer un objet du type de la classe dérivée comme étant un objet du type de la classe de base! (cf principe de substitution de Liskov)
    Quid des politiques ?

  5. #5
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 626
    Points : 30 684
    Points
    30 684
    Par défaut
    Citation Envoyé par oodini Voir le message
    Quid des politiques ?
    Le paradigne générique et les politiques permettent des choses que ne permet pas le paradigme OO

    N'oublies pas que si tu as une classe template proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <typename T>
    class Base
    {
     /* ...*/
    };
    Base <UnType> et Base<UnAutreType> correspondent à deux types pour lesquels il n'existe aucun lien entre les deux, et dont, la seule chose que l'on puisse dire, c'est qu'ils ont simplement une interface semblable (mais pas forcément identique, surtout pour les fonctions prenant un T en argument ou ayant T comme valeur de retour )

    Nous sommes donc face à l'exception qui confirme la règle, mais, à défaut de savoir si l'OP s'inscrit dans une telle optique, il me semble fortement préférable de considérer qu'il n'est pas confronté à un tel cas de figure, et donc, de donner le conseil se rapportant à "la règle générale"

    Enormément de problèmes sont dus à des erreurs de conceptions et, essentiellement, au fait d'avoir choisi de recourir à l'héritage alors qu'il n'était pas opportun de le faire!!!

    Commencer par rappeler que l'héritage (et surtout l'héritage multiple) doit etre envisagé avec la plus grande rigueur et la plus grande prudence semble donc être le meilleur conseil que l'on puisse donner, à défaut d'avoir la certitude que l'héritage (qu'il soit simple ou multiple) est réellement opportun dans le cas qui intéresse la personne qui pose la question
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

Discussions similaires

  1. Comment créer une interface avec implémentation
    Par Linconnu dans le forum Développement Web en Java
    Réponses: 1
    Dernier message: 27/10/2011, 18h12
  2. Interfaces et implémentations avec checked exceptions
    Par dingoth dans le forum Langage
    Réponses: 2
    Dernier message: 30/04/2010, 16h10
  3. Réponses: 4
    Dernier message: 05/05/2008, 11h43
  4. Problème d'interface et implémentation
    Par dolu02 dans le forum Langage
    Réponses: 3
    Dernier message: 07/05/2007, 23h04
  5. Réponses: 2
    Dernier message: 08/01/2006, 15h09

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