Héritage et plugin - C++ - Programmation
Marsh Posté le 15-03-2006 à 15:21:11
je vois pas comment tu fais pour utiliser directement B::foo quand t'as un A*/A& ... donc je ne vois pas le problème.
Marsh Posté le 16-03-2006 à 09:48:52
Hu !
Code :
|
Code :
|
Code :
|
Marsh Posté le 16-03-2006 à 10:05:24
Citation : A* b = loadPluginA(huhu, haha); |
Bah définir pouet() en méthode virtuelle dans A
Marsh Posté le 16-03-2006 à 11:07:52
Nan j'veux pas !
Dans mon précédent post, j'ai simplifié les choses en ne mettant que 2 classes, normalement il peut encore y avoir de l'héritage derrière (et donc de nouvelles méthodes).
Marsh Posté le 16-03-2006 à 11:13:20
écoute, si tu compiles "x->pouet()" alors pouet doit être déclaré à la compilation.
avec ton système, si je fais un plugin avec une méthode x->pilu() :
- comment fait-on pour l'appeler ?
- qui décide de l'appler ?
- elle est appelée comment ?
c'est pas la peine de faire de l'héritage si tu fais pas de polymorphisme. Un plugin, c'est un bout de code chargeable à la demande qui fournit une interface. Si quelque chose n'est pas dans l'interface, ça n'est pas utilisable.
Marsh Posté le 16-03-2006 à 11:28:37
J'ai pas dit que j'avais bien écrit mon bordel.
Je vous dit que ce que j'ai écrit ne marche pas pour ce que je veux, et j'aimerais trouver un moyen de faire ce que je veux.
Alors avez-vous une idée ?
Marsh Posté le 21-08-2006 à 10:27:11
J'ai l'impression que tu pourrais résoudre ton probleme grace au design pattern Visitor.
http://en.wikipedia.org/wiki/Visitor_pattern
la seule chose que tu as à rajouter dans ta classe mère est la fonction accept(Visitor *), en virtual, bien entendu.
Ensuite tu cré une classe abstraite Visitor qui à une methode visit() par classe de ton design (classe A, B, C). Chaque méthode visit prendra une classe différente.
Et dans le accept de chacune des classes, tu mets ce que tu veux mettre...
Tu pourrais donc faire une classe VisitorInitPlugin qui initialise chacun des plugins, par exemple...
Je suis pas sûr que le design colle parfaitement à ton probleme, mais ça vaut peut être le coup d'essayer!
Edit> je viens de voir cela sur dlopen et le C++, c'est assez intéressant... http://www.tldp.org/HOWTO/C++-dlopen/theproblem.html
Marsh Posté le 21-08-2006 à 10:51:41
visitor ça change rien. Il faut appeler la même méthode A::accept. Tu pouras jamais appelé B::machin ...
Marsh Posté le 14-03-2006 à 09:55:05
Salut !
Mon projet consiste en une série d'héritage de classes : la classe C hérite de la classe B, qui elle-même hérite de la classe A (C ->
B -> A).
À chaque fois que l'on descend dans l'héritage, j'ajoute des méthodes plus spécifiques.
Dans mon projet, je dois facilement ajouter de nouvelles fonctions, je me suis donc tourné vers l'utilisation de plugins (dlopen, etc...).
Dans mon cas, les plugins sont donc des implémentations des classes B et C.
Mon problème survient lors de l'instanciation des plugins : puisque seule la classe A est connue de mon système de plugin, les nouvelles méthodes implémentées dans les classes B et C ne sont pas instanciables.
Existe-t-il une solution à ce problème ?
Ou bien dois-je obligatoirement utiliser les mêmes méthodes, mais pas forcément implémentées de la même manière ?
Merci d'avance.