Я пытаюсь заменить простые перечисления на классы типов ... то есть один класс, производный от базы для каждого типа. Так, например, вместо:
enum E_BASE { EB_ALPHA, EB_BRAVO };
E_BASE message = someMessage();
switch (message)
{
case EB_ALPHA: applyAlpha();
case EB_BRAVO: applyBravo();
}
Я хочу сделать это:
Base* message = someMessage();
message->apply(this); // use polymorphism to determine what function to call.
Я видел много способов сделать это, которые кажутся менее изящными, чем базовый оператор switch. Использование dyanimc_cast, унаследованного от класса messageHandler, который необходимо обновлять при каждом добавлении нового сообщения, с использованием контейнера указателей на функции, похоже, все они не позволяют облегчить поддержку кода путем замены переключателей полиморфизмом.
Это настолько близко, насколько я могу получить: (я использую шаблоны, чтобы избежать наследования от всезнающего интерфейса обработчика)
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";
}
};
Очевидно, что это не компилируется, но я надеюсь, что это решит мою проблему.