Conception: ajout de fonctionnalités
Bonjour à tous,
J'ai un "problème" de conception: j'ai une classe A:
Code:
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;
}
}; |
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:
1 2 3 4 5 6 7 8 9
|
class AWithFunction : public A
{
public:
void mult()
{
setVal(getval()*10);
}
}; |
et pour l'utilisation, il fait un truc du genre:
Code:
1 2 3 4
|
A a(5);
static_cast<AWithFunction*>(&a)->mult();
std::cout << a.getVal() << std::endl; |
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?