дублирование кода, за исключением того, что новый класс является новым

Как я могу избавиться от дублирования кода в моих функциях 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();
}

1

Решение

Вы можете попробовать следующее в вашем классе:

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 ...
1

Другие решения

Может быть, что-то вроде этого:

virtual void visitUpper(const Potion& potion)
{
CommonCode(new UpperAction(potion));
}
virtual void visitDowner(const Potion& potion)
{
CommonCode(new DownerAction(potion));
}
1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector