Я видел пару примеров, демонстрирующих шаблон посетителя. Во всех из них каждый вычисленный элемент-элемент реализует то, что обычно называют методом Accept().C++ visitor pattern: Почему каждый полученный посетитель реализует Accept()?
В иерархии цветов, этот метод может выглядеть следующим образом:
void Red::accept(Visitor *v)
{
v->visit(*this);
}
void Blue::accept(Visitor *v)
{
v->visit(*this);
}
Когда посетитель, а также его преемники, есть методы:
visit(Red red);
visit(Blue blue)
Мой вопрос, почему не осуществить это таким же образом только в базовом классе (в этом примере: Color
), и полиморфизм выполнит эту задачу, а именно, будет вызван правильный визит, поскольку, когда объект является Red
, этот динамический тип является Red
, поэтому разыменование он даст Red
, что, в свою очередь, вызовет визит (красный)?
Что мне не хватает?
Если вы хотите его в базовом классе, тогда вы должны использовать [Любопытно повторяющийся шаблон шаблона] (https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern), чтобы получить право 'this'. – user1810087
На более динамичном языке вам, возможно, придется называть функции 'visitBlue' и' visitRed'. Вы можете сделать это и здесь. Помогло ли это в этом смысле? –
Ответ уже предоставлен, но вы можете найти дополнительную информацию в Интернете для «двойной отправки» (я предполагаю, что вы уже искали «шаблон посетителя», и это вам не помогло), что является названием используемой техники Вот. –