Héritage : cast ou non ?
Elipso
-
Char Snipeur Messages postés 10112 Statut Contributeur -
Char Snipeur Messages postés 10112 Statut Contributeur -
Bonjour,
Je souhaiterais faire l'héritage suivant :
Maintenant, a côté de ça, j'ai un autre héritage de classes qui utilisent, par composition, les class B et C :
Ma question est : vaut-il mieux faire :
et caster après selon le modèle (B/C) qu'on à en membre ou :
et ne pas profiter éventuellement du polymorphisme ?
Merci :)
Je souhaiterais faire l'héritage suivant :
class A class B : public class A class C : public class A
Maintenant, a côté de ça, j'ai un autre héritage de classes qui utilisent, par composition, les class B et C :
class Controler class ControlerC : public Controler class ControlerB : public Controler
Ma question est : vaut-il mieux faire :
class Controler {
public :
Controler();
~Controler();
void SetModel(A*);
protected :
A* model;
}
et caster après selon le modèle (B/C) qu'on à en membre ou :
class Controler {
public :
Controler();
~Controler();
}
class ControlerB : public Controler {
public :
//...
SetModel(B*)
private :
B* model;
}
class ControlerC : public Controler {
public :
//...
SetModel(C*)
private :
C* model;
}
et ne pas profiter éventuellement du polymorphisme ?
Merci :)
2 réponses
Je vois au moins deux manières de faire mieux.
1) Si la seule différence de ControlerB et ControlerC c'est d'embarquer un type de Model différent, on peut imaginer simplement avoir une seule classe Controler qui stocke un A* et se reposer sur le lien dynamique pour invoquer de manière appropriée les méthodes implémentées dans A, B ou C. Il faut juste que les méthodes de A soient virtual.
https://forums.commentcamarche.net/forum/affich-27621184-fonctions-virtuelles-en-c#p27622390
2) Une autre manière de faire consiste à ce que Controler soit une classe template qui prend en paramètre un model :
Bonne chance
1) Si la seule différence de ControlerB et ControlerC c'est d'embarquer un type de Model différent, on peut imaginer simplement avoir une seule classe Controler qui stocke un A* et se reposer sur le lien dynamique pour invoquer de manière appropriée les méthodes implémentées dans A, B ou C. Il faut juste que les méthodes de A soient virtual.
https://forums.commentcamarche.net/forum/affich-27621184-fonctions-virtuelles-en-c#p27622390
2) Une autre manière de faire consiste à ce que Controler soit une classe template qui prend en paramètre un model :
template <typename Tmodel>
class Controler {
protected:
Tmodel * model;
...
};
int main() {
Controler<B> cb;
...
return 0;
}
Bonne chance