Bonjour à tous,
J'ai un "problème" de conception: j'ai une classe A:
Je voudrai lui ajouter une fonctionnalité: admettons que je veuille lui ajouter une méthode qui multiplie la valeur par 10 (c'est un exemple bidon pour illustrer mon problème): j'ai lu que lorsque l'on veut ajouter des fonctionnalités à une classe, on peut utiliser le design pattern visitor mais un ami procède de la manière suivante pour ajouter une fonctionnalité:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 class A { private: int val; public: A(int valeur=0) : val(valeur) {} int getVal() const throw() { return val; } protected: void setVal(int valeur) { val = valeur; } };
et pour l'utilisation, il fait un truc du genre:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 class AWithFunction : public A { public: void mult() { setVal(getval()*10); } };
Alors pour que ça marche, il me dit qu'il ne faut pas ajouter d'attributs dans la classe fille, par contre le gros avantage par rapport à l'approche visiteur est que dans ma classe fille, j'ai accès à la méthode protégée de la classe A (du fait de l'héritage). D'où ma question: que pensez-vous de cette approche de cast "violent", comment feriez vous avec une autre approche (type visiteur) pour éviter que je mette la méthode setVal de ma classe A en public?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 A a(5); static_cast<AWithFunction*>(&a)->mult(); std::cout << a.getVal() << std::endl;
Partager