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 :

Etendre une série de classe non modifiable/ Héritage virtuel


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Par défaut Etendre une série de classe non modifiable/ Héritage virtuel
    Bonjour à tous. J'aimerais connaitre la meilleur façon d'étendre une classe du type :

    class Base (classe abstraite);
    class Derived1 : public Base;
    class Derived2 : public Base;
    class Derived3 : public Base;

    Le problème étant que j'aimerais créer créer une nouvelle classe, similaire à Base mais possédant une fonction virtuelle pure et définir l'implémentation de cette fonction virtuelle pure dans Derived1, Derived2 et Derived3.

    Le problème : je dois créer cette nouvelle classe sans toucher au code de Base, Derived1, Derived2 et Derived3. De plus, il faudrait qu'à chaque extension de Base ma classe s'étende aussi sans y toucher. Et pour finir, il faudrait pouvoir rajouter des classes sans problème.

    On pourrait imaginer un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class MonBase : public Base
    {
          virtual bool f()=0;
    };
    class MonDerived1 : virtual public MonBase, virtual public Derived1
    {
          virtual bool f(){/*qqch*/}
    };
    ....

    ce système fonctionnerais.

    Cependant, sa me parait mettre beaucoup de code pour pas grand chose et l'héritage virtuelle ne me parait pas super.
    Pour la syntaxe du virtuel, je m'en souvient plus très bien (c'est la première fois que cette possibilité est envisageable) mais si c'est la seule solution je ferais comme sa.


    Merci.

  2. #2
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Bonjour,
    Je crois que quelques précisions s'imposent, histoire d'être bien sûr qu'on parle de la même chose…

    Citation Envoyé par NoIdea Voir le message
    j'aimerais créer créer une nouvelle classe, similaire à Base
    Qu'est-ce que tu entends exactement par « similaire » ?
    En gros, il faut qu'elle ait exactement le même comportement que « Base », quoiqu'il arrive ?

    Citation Envoyé par NoIdea Voir le message
    De plus, il faudrait qu'à chaque extension de Base ma classe s'étende aussi sans y toucher.
    Qu'est-ce que tu veux dire par « extension » ?
    Des ajouts dans la classe ?
    D'autres classes-filles ?

    Citation Envoyé par NoIdea Voir le message
    Et pour finir, il faudrait pouvoir rajouter des classes sans problème.
    Rajouter des classes…
    Euh, où ça ?

    Pour l'héritage virtuel, direction la FAQ.
    Mais je crains qu'il faille modifier les classes « Derived* ».

  3. #3
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Par défaut
    Semblerais que je n'ai pas été assez explicite.
    Je vais donc prendre le cas qui m'intéresse.
    J'utilise la SFML et je ne souhaite pas modifier les sources.
    Cependant, dans la classe Drawable, il me manque une méthode cruciale : virtual bool IsOnDrawable()=0;
    Cette fonction est virtuelle pure et j'ai déjà prévu quel serait son comportement pour les Shape/Sprite/String.

    Mon problème : je ne veux modifier les sources. Je ne peux donc rajouter ces trois fonctions dans les .h correspondants.
    Cependant, il me faudrait qu'à chaque nouvelle version de la SFML (imaginons une nouvelle fonction dans la classe Drawable) soit présente dans ma nouvelle classe sans modifier une seule ligne de code.
    De plus, on doit pouvoir implémenter les classes Shape/Sprite/String avec cette nouvelle fonction. Il faut donc créer ShapeBis, SpriteBis et StringBis. Malheureusement, il faut aussi que c'est trois classe "se mettent à jour automatiquement" quand Shape, Sprite et String sont modifiés. Ou encore, si il s'agit d'un type qu'une autre bibliothèque a créé (qui hérite de Drawable)et qu'on ne veut aussi modifier.

    Ainsi, j'en conclut que DrawableBis doit hériter de Drawable (pour permettre "les mises à jours") ; que toute classe héritant de Drawable à laquelle on veut rajouter cette fonction (appelons la DerivedBis) doit hériter de DrawableBis et de Derived.

    Ainsi, j'obtiens un losange et donc un héritage virtuel.

    Y a t-il une autre solution ?

  4. #4
    Membre expérimenté
    Homme Profil pro
    Analyse système
    Inscrit en
    Novembre 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 227
    Par défaut
    Tu peux envisager d'utiliser des design pattern (le design pattern decorator pourrait répondre à ce que j'ai compris de ton problème.)

  5. #5
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Ok, je vois.
    C'est à peu près ce que j'avais compris, mais je voulais être sûr.

    Faire de l'héritage multiple pourrait être une solution (enfin disons plutôt une façon de faire…).
    Mais comme je le disais, il faudrait modifier les classes Shape/Sprite/String.
    Donc ce n'est pas possible.

    Je ne pense pas assez aux design pattern, alors qu'ils peuvent rendre de bien grands services, et parfois de manière assez simple…

  6. #6
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Par défaut
    Il me semble que le pattern Decorator ne répondent pas à mes besoin : il faudrait modifier Drawable (le faire hérité d'une interface). Cependant, je ne le connaissais pas et répond à un autre besoin que j'avais

    Je vais essayé de faire un shémas en asseyant d'être plus compréhensible.

    Voila les classes SFML, je n'ai le droit de toucher à aucune de ces classes. Il manque une méthode virtuelle pure bool IsOnObject(const Point& P)const dans Drawable et leur implémentation dans les dérivés.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
                          Drawable
                         /     |     \
                     Shape    Sprite  String
    Maintenant, voici les nouvelles classes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
                       DrawableBis
                       /       |       \
                ShapeBis  SpriteBis  StringBis
    Or, DrawableBis doit hérité de Drawable pour avoir toutes les méthodes/propriété de Drawable. On a donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                                                  Drawable
                                                       |
                                          D R A W A B L E B I S
                                         /             |             \
                                   ShapeBis       SpriteBis      StringBis
    Or, ShapeBis, SpriteBis et StringBis doivient hériter respectivement de Shape, Sprite et String pour avoir toues leurs méthodes/propriétés.

    On obtient donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                                     ---------Drawable---------------------
                                     |                 |                  |
                                     |   D R A W A B L E B I S            |
                                     |   /             |             \    |
                                   ShapeBis       SpriteBis      StringBis
    Il nous faut donc de l'héritage virtuel. Cependant, on arrive au résultat voulu.


    Ma question est :

    Existe-il une solution sans héritage virtuel ?

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

Discussions similaires

  1. Comment fournir une base de donnees non modifiable
    Par nadia123456 dans le forum Sécurité
    Réponses: 2
    Dernier message: 29/09/2008, 20h24
  2. Réponses: 2
    Dernier message: 21/07/2008, 14h26
  3. Réponses: 1
    Dernier message: 18/02/2008, 12h55
  4. Héritage d'une classe MFC et d'une classe non MFC
    Par Etienne Paquette dans le forum MFC
    Réponses: 7
    Dernier message: 04/12/2007, 20h19
  5. [Débutant] Filtrer une zone de liste non modifiable
    Par jeanchcom dans le forum Access
    Réponses: 7
    Dernier message: 08/08/2006, 09h48

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