Bonjour à tous,

J'ai un "problème" de conception: j'ai une classe A:
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;
  }
};
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
 
class AWithFunction : public A
{
public:
  void mult()
  {
    setVal(getval()*10);
  }
};
et pour l'utilisation, il fait un truc du genre:
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;
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?