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 :

Héritage avec droits d'accès différents..


Sujet :

C++

  1. #1
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 9
    Points : 7
    Points
    7
    Par défaut Héritage avec droits d'accès différents..
    Bonjour,

    Il était difficile de faire tenir l'étendue du problème dans le titre, aussi il n'est pas forcément très bien choisi (mais vous en jugerez après la lecture de la question). J'ai une hiérarchie de classe sur 3 niveaux, et je voudrais que la dernière hérite publiquement de la première, mais "protégément" (o_O) de la seconde. En gros :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class A;
    class B : public A;
    class C : protected B, public A;
    Évidemment ce serait trop beau si ça marchait tel quel (même avec class B : virtual public A; ).

    Le problème est épineux puisque la classe C a un comportement vraiment similaire à B (avec des données membres en plus). En revanche, l'utilisateur ne devrait pas pouvoir modifier les données de B via C..

    Alors, est-ce seulement possible de faire ça en C++ ?
    D'avance merci.

    PS: en dernier recours, je pourrais masquer les méthodes indésirables de B en private dans C, mais bon.. bof.

  2. #2
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Euh... ça sent pas bon ta conception là...

    C'est pas plutôt une composition qu'il te faudrait là? Ou un pattern Proxy? Je lance des trucs un peu au pif là, mais si tu pouvais nous en dire plus, on pourrait sans doute être plus précis!

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2007
    Messages : 53
    Points : 37
    Points
    37
    Par défaut
    C'est vrai qu'un héritage pareil laisse un peu pensé que la conception est peut-être pas trs bien pensée... (m'enfin, je dis ça, c'est peut-être que je suis pas un fan du modèle de l'héritage multiple )

  4. #4
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Mmh, en fait il s'agit d'un moteur 2D basique qui fonctionne avec DirectX.

    J'ai une classe virtuelle pure Object2D qui regroupe les données et méthodes communes à tous les objets 2D. Cette classe ne contient que des données "abstraites", mais pas au sens C++ du terme, comprenez tout ce qui décrit théoriquement l'objet (position, visibilité, etc. mais pas de vertex buffer et tous ces trucs là).

    De cette classe dérive donc Quad, qui comme son nom l'indique.. est un polygone à 4 sommets. Elle, en revanche, contient les données réelles (tableau des points, toussa).

    Et donc, pour finir, une classe Sprite qui est.. un sprite (une image quoi). Ma logique consiste à penser que le sprite est simplement un quad avec une texture. Dans les faits, c'est exactement ça, j'applique une texture sur mon quad, et paf chocapic. Cependant, la taille du sprite, par exemple, doit dépendre de la taille de l'image originale ; alors que la taille du quad est choisie par l'utilisateur.. Donc pour le coup, les méthodes SetWidth et SetHeight du quad ne devraient pas être disponibles pour un sprite, alors que SetPosition de Object2D lui est indispensable..

    Donc ? Problème de conception ?

  5. #5
    Membre averti Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Points : 323
    Points
    323
    Par défaut
    Sans aller plus loin, est-tu sur que tu ne veux pas de SetWidth et SetHeight dans ta class sprite? Çà veu dire que tu t'interdit de redimensionner tes images? Je n'ai jamais fait de DirectX, mais en openGL, la dimension de l'image et celle du quad n'ont absolument pas à être liées.

    A partir de la tu peu hériter de la class quad, et faire un héritage propre.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2007
    Messages : 53
    Points : 37
    Points
    37
    Par défaut
    Autrement, tu fais un truc bourrin

    Toutes les méthodes de ta classe C qui accède à la classe B tu les mets en const

  7. #7
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Nogane Voir le message
    Çà veu dire que tu t'interdit de redimensionner tes images? Je n'ai jamais fait de DirectX, mais en openGL, la dimension de l'image et celle du quad n'ont absolument pas à être liées.
    Exact ! Oui je voulais interdire le redimensionnement du quad, préférant utiliser la matrice scale pour le changement de taille. Mais bon effectivement, dans l'absolu ça ne pose pas de problème de l'autoriser..

    Citation Envoyé par pyknite
    Toutes les méthodes de ta classe C qui accède à la classe B tu les mets en const
    o_O Hem, je ne vois pas trop où tu veux en venir, mais ça ne changera rien au fait que Sprite comportera toutes les méthodes publiques de Quad, et c'est ça que je ne voulais pas..

    Enfin bon, ça me permet au moins de savoir que l'héritage ne permet pas ce genre de trucs en C++. Je vais sans doute finir par autoriser tous ces trucs sur mes sprites.
    Merci.

    Edit: y'a pas une balise [contourné], parce que là on peut pas vraiment dire que c'est résolu..

  8. #8
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Tu as besoin du polymorphisme ?

    Parce que, si tu fais un héritage protégé de B, il ne sera plus polymorphique ?

    Si je suis bien ce que tu veux faire, tu aurais besoin que :
    - C soit un A
    - B soit un A
    - C ne soit pas un B
    - C incorpore des fonctionnalités de B
    - les fonctionnalités de B incorporés dans C travaillent sur le même A que les fonctionnalités que tu rajoutes dans C

    La bonne conception que je vois, dans ce cas, c'est :
    - définir une interface IA
    - A implémente IA
    - B hérite publiquement de A
    - C implémente IA, et a un membre protégé de type B (composition).

    Ça t'oblige à réimplémenter dans C l'interface IA (juste un wrappeur pour appeler les méthodes du membre B, et peut-être qu'avec de la métaprogrammation, on peut le faire faire par le compilo, à creuser, mais s'il n'y a qu'une classe C ça ne sert pas à grand chose), mais ça me semble correspondre à ton besoin.

Discussions similaires

  1. Droits d'accès différent PHP/FTP
    Par Jean-Georges dans le forum Langage
    Réponses: 1
    Dernier message: 10/06/2013, 14h51
  2. organisation d'admin avec droits d'accès restreints
    Par artichaudd dans le forum Langage
    Réponses: 4
    Dernier message: 29/11/2010, 19h36
  3. Ouverture d'une connexion avec droit d'accès
    Par DEV-10 dans le forum VB.NET
    Réponses: 6
    Dernier message: 20/10/2010, 04h01
  4. FTP simple avec droits d'accés
    Par branqueira dans le forum Windows Serveur
    Réponses: 1
    Dernier message: 20/03/2007, 14h23
  5. Réponses: 10
    Dernier message: 13/01/2007, 13h46

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