Как я могу избавиться от дублирования кода в моих функциях vistUpper, visitDowner, visitX …? единственное, что отличается от них, — это создание нового WhhapsAction (params)
Я могу сделать функции startVisit и endVisit, которые уменьшат продолжительность дублирования, но дублирование все еще будет … Я надеялся, что может быть более элегантный способ сделать это?
virtual void visitUpper(const Potion& potion)
{
// leave if unavailable action for various reasons
// and a few more things...
PotionAction* action = new UpperAction(potion);
actions.push_back(action);
// add to our button list
}
virtual void visitDowner(const Potion& potion)
{
// leave if unavailable action for various reasons
// and a few more things...
PotionAction* action = new DownerAction(potion);
actions.push_back(action);
// add to our button list
}
// ... and some more visitX which are identical except new XAction ...
void actOn(int actionIndex)
{
actions[actionIndex]->prepareDrink();
}
Вы можете попробовать следующее в вашем классе:
private:
template<typename T>
void visit(const Potion& potion)
{
// leave if unavailable action for various reasons
// and a few more things...
PotionAction* action = new T(potion);
actions.push_back(action);
// add to our button list
}
public:
virtual void visitUpper(const Potion& potion)
{
visit<UpperAction>(potion);
}
virtual void visitDowner(const Potion& potion)
{
visit<DownerAction>(potion);
}
// more visitXXX ...
Может быть, что-то вроде этого:
virtual void visitUpper(const Potion& potion)
{
CommonCode(new UpperAction(potion));
}
virtual void visitDowner(const Potion& potion)
{
CommonCode(new DownerAction(potion));
}