Solution à un problème de design

Solution à un problème de design - C++ - Programmation

Marsh Posté le 13-05-2007 à 09:23:15    

Salut les progueux  :hello:

 

Bon je m'excuse d'avance si ca a déja été traité / trivial mais j'avoue que j'ai pas trouvé de terme pertinent pour lancer une recherche  :o

 

Voilà mon problème : j'ai une hiérarchie simplissime de trois classes. Une classe de base (A) et deux classes qui en héritent (B et C). Sur A j'ai une méthode (virtuelle pure) protected qui fait office de fonction utilitaire puisque j'aimerai que les classes dérivées puissent s'en servir mais pas l'exterieur. Cette méthode me permet d'accéder à des infos internes à la classe qui l'implémente (retourne une instance de class infos).

 

J'ai donc logiquement un truc comme ça :

Code :
  1. class A {
  2. public:
  3.   A();
  4.   virtual ~A();
  5.   virtual bool link(A *peer) = 0;
  6. protected:
  7.   virtual infos *helper() = 0;
  8. };
  9. class B : public A{
  10. public:
  11.   B();
  12.   virtual ~B();
  13.   virtual bool link(A *peer);
  14. protected:
  15.   virtual infos *helper();
  16. };
  17. class C : public A {
  18. public:
  19.   C();
  20.   virtual ~C();
  21.   virtual bool link(A *peer);
  22. protected:
  23.   virtual infos *helper();
  24. };


Mon souci c'est que j'aimerai faire quelque chose comme ça:

Code :
  1. bool B::link(A *peer) {
  2.   infos *infos_peer = peer->helper();
  3.   infos *infos_self = helper();
  4.   // traitement en fonction de ces infos
  5.   ...
  6. }


Mais c'est pas possible, A::helper() est protected dans ce contexte :(
Alors à part passer la fonction helper() en public (ce qui ne me plaît pas du tout) est ce qu'il existe une solution à ce problème ? Ou est ce que c'est un problème de design plus général ?


Message édité par Bi$cotte le 13-05-2007 à 14:36:14
Reply

Marsh Posté le 13-05-2007 à 09:23:15   

Reply

Marsh Posté le 13-05-2007 à 11:11:37    

Salut !
Heu, tu n'aurrai pas tout simplement oublié de faire hériter B et C de la classe A ? Et puis la je vois pas pourquoi ça ne marcherai pas...

Reply

Marsh Posté le 13-05-2007 à 11:16:29    

Euh oui, dans le code, où est la relation d'héritage ? (antidtc bouclar activated)


---------------
Töp of the plöp
Reply

Marsh Posté le 13-05-2007 à 11:17:21    

et sinon friend ...


---------------
Töp of the plöp
Reply

Marsh Posté le 13-05-2007 à 14:23:42    

Oui merde daysolay  pour le public A, c'est une typo :o
Par friend t'entend déclarer B et C comme friend de A ?
C'est pas génial pour le jour ou je fais dériver une autre classe de A ... mais c'est moins pourri que le public.
C'est chiant un peu comme problème :o

Reply

Marsh Posté le 13-05-2007 à 14:29:56    

Je pense que tu dois pas bien saisir...
Tu dit que B et C héritent de A alors que dans le code que tu donne tu ne fait aucun héritage... Donc c'est normal que ça marche pas.
Et puis en ce qui conserne le friend c'est bien sur ta fonction helper qui doit être friend (mais c'est pour faire une alternative a l'héritage vu que tu en fasait pas...) Mais j'ai lut que c'étais a éviter le plus possible... (mais c'est une solution)

Reply

Marsh Posté le 13-05-2007 à 14:35:49    

Oui, c'est moi qui ai fait une erreur dans le code que j'ai mis dans le premier post, j'ai oublié le public A. B et C héritent bien de A. (j'édite le post être tranquille).
L'ennui c'est que ma fonction helper() elle est virtuelle. En la sortant de la classe Je peux toujours la faire appeller une fonction virtuelle protected déclarée dans A et redéfinie par B et C mais c'est assez bordélique je trouve.
Je pensais qu'il y avait une autre solution que passer par du friend ou du public, mais c'est vrai que c'est pas evident.

 

Ca pete l'encapsulation :o pis mes evil users ils peuvent toujours appeler ma fonction friend et foutre leur merde :o

 

Heu sinon Amonchakai, je t'assure qu'appeler une méthode protected sur un objet autre que this (quand on est pas dans la classe de base) ben ca passe pas.


Message édité par Bi$cotte le 13-05-2007 à 14:42:57
Reply

Marsh Posté le 13-05-2007 à 14:49:09    

ha bah c'est moi qui comprends pas tu veux héviter l'héritage public, c'est ça ?
Mais je pense pas que ça soit crade de le faire...
[edit] ha ça y est je viens de voir :D j'avais pas vu que tu appellais la méthode helper() d'une instance de A dans ta méthode link de la classe B...  
Donc oui, a priori je serai tenté de dire qu'il faudrai passer ta méthode helper en public...
 
désolé :D


Message édité par Amonchakai le 13-05-2007 à 14:54:02
Reply

Marsh Posté le 13-05-2007 à 18:42:44    

Comme le contrôle d'accès s'effectue "par classe" (et non par objet), en C++, tu peux/dois appeler helper depuis une fonction membre de la classe A. Une solution consiste à faire en sorte que link soit une fonction publique non virtuelle qui effectue des pré-post traitement avant l'appel à une fonction membre protégée -ou private- virtuelle -pure ou non- doLink. Cette fonction doLink peut-être customisée dans les classes plus dérivées. C'est le pattern (mal) nommé "template méthode".  
 
Il y a un intérêt à rendre doLink protégé si on en fourni une implémentation dans la classe de base. Cette implémentation par défaut peut être appelé depuis une fonction doLink d'une classe plus dérivée.
 
Peut-être que cette technique peut fonctionner pour ce que tu essayes de faire.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed