J'essaie de remplacer des énumérations simples par des classes de types .. c'est-à-dire, une classe dérivée d'une base pour chaque type. Ainsi, par exemple au lieu de:Comment convertir élégamment switch + enum avec polymorphisme
enum E_BASE { EB_ALPHA, EB_BRAVO };
E_BASE message = someMessage();
switch (message)
{
case EB_ALPHA: applyAlpha();
case EB_BRAVO: applyBravo();
}
Je veux faire:
Base* message = someMessage();
message->apply(this); // use polymorphism to determine what function to call.
Je l'ai vu beaucoup de façons de le faire, qui tous semblent moins élégante même alors l'instruction switch de base. En utilisant dyanimc_cast, héritant d'une classe messageHandler qui doit être mise à jour chaque fois qu'un nouveau message est ajouté, en utilisant un conteneur de pointeurs de fonction, tout semble aller à l'encontre du but de simplifier le code en remplaçant les commutateurs par du polymorphisme.
C'est aussi proche que je peux obtenir: (j'utiliser des modèles pour éviter héritant d'un omniscient interface gestionnaire)
class Base
{
public:
template<typename T> virtual void apply(T* sandbox) = 0;
};
class Alpha : public Base
{
public:
template<typename T> virtual void apply(T* sandbox)
{
sandbox->applyAlpha();
}
};
class Bravo : public Base
{
public:
template<typename T> virtual void apply(T* sandbox)
{
sandbox->applyBravo();
}
};
class Sandbox
{
public:
void run()
{
Base* alpha = new Alpha;
Base* bravo = new Bravo;
alpha->apply(this);
bravo->apply(this);
delete alpha;
delete bravo;
}
void applyAlpha() {
// cout << "Applying alpha\n";
}
void applyBravo() {
// cout << "Applying bravo\n";
}
};
De toute évidence, cela ne compile pas, mais je suis en espérant qu'il obtient mon problème à travers.
Vous ne montrant que la consommation de messages. Comment sont-ils produits? Est-ce qu'il y a un besoin de sandbox-> applyBravo (bravo) ou autre? Plus d'info aiderait. – Arkadiy
Passer un paramètre serait sympa - 'classe EatPotatoes: public Message {public: int combien};' qui aboutirait à appeler 'sandbox-> eatPotatoes (5);' si howMany égalait 5, par exemple. – Kyle