Voici un petit pb de conception qui n'est pas forcément spécifique à C++.
Je manipule plusieurs classes appelée WidgetX par l'intermédiare d'une interface IWidget dont elles dérivent :
Jusque ici rien de bien méchant.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 class Widget1 : public IWidget {...} class Widget2 : public IWidget {...} class Widget3 : public IWidget {...} ...
Mais voila, supposons que la classe Widget3 ait besoin d'une méthode publique spécifique, par exemple : getSpecific() que les autres Widget1 et Widget2 n'implémentent pas.
Du coup, dans ce cas, quelle est la meilleure facon de procéder ?
- J'imagine que le down casting IWidget -> Widget3 n'est pas fameux.
- Ou bien, on pourrait écrire une méthode getSpecific() pour toutes les classes dérivées Widgetx et que l'on mettrait virtuelle pure dans IWidget mais qui ne ferait rien pour Widget1 et Widget2
- Ou alors, on pourrait écrire :
class Widget3 : public IWidget, SpecificWidget {...} et cross caster de IWidget vers SpecificWidget qui aurait la methode virtuelle pure getSpecific() mais ca parait lourd.
- Enfin, je pourrais utiliser le pattern strategy, ie par exemple fournir un objet specifique du style SpecificWidgetBehavior dans le constructeur de Widget3, mais ensuite, comment acceder à cet objet à partir de l'interface IWidget car celle ci n'aurait pas l'utilité d'implémenter une méthode du style getBehavior() car WIdget1 et Widget2 n'en ont pas besoin ?
Bref, je suis presque sur que tout le monde est plus ou moins confronte à cette situation, alors je suis sur que vos idées seront meilleurs que les miennes car je tourne un peu en rond ...
Merci d'avance pour vos suggestions.
Partager