Как работает double dispatch в шаблоне посетителей?

Я изучал другие вопросы, связанные с шаблоном посетителя, но не мог понять реализацию двойной отправки в шаблоне посетителя.

пожалуйста, обратитесь к ссылке Шаблон Visitor

как двойная отправка работает в шаблоне посетителя?

3 ответов


объект элемента accept метод получает объект посетителя и вызывает visit метод на объекте посетителя. Поскольку объект посетителя имеет несколько visit методы, основанные на типе элемента соответствующий visit метод называется. Здесь у нас есть два звонка (двойной диспетчеризации), что указать элемент и справа операция для элемента (на основе его типа).


один-диспетчерского

Single dispatch

предположим, что узел является классом интерфейса, а два подкласса являются конкретными реализациями интерфейса.

если вы называете GenerateCode() метод на экземпляре узла, фактическое выполнение операции зависит от тип узла. Это может быть метод либо в VariableRefNode или AssignmentNode. То же самое, если вы позвоните PrettyPrint(). Таким образом, фактическое выполнение операции зависит от название метода вы звоните и тип узла.

двойной отправки

NodesVisitors

в этот раз Node позволяет передать параметр типа NodeVisitor его метод, называемый Accept. В вашей программе, если вы вызываете Accept на экземпляре узла фактическая операция, выполняемая теперь, зависит от тип узла (VariableRefNode или AssignmentNode) и тип экземпляра посетителя, который вы передали в Accept (TypeCheckingVisitor или CodeGeneratingVisitor).


Ну, вот соответствующая цитата из этой статьи:

посетитель реализует "double dispatch". OO сообщения обычно манифестируют "одиночную отправку" - выполняемая операция зависит от: имени запроса и типа получателя. В "двойной отправке" выполняемая операция зависит от: имени запроса и типа двух получателей (типа посетителя и типа элемента, который он посещает).

Это по существу означает, что разные посетители могут посещать один и тот же тип, и разные типы могут посещать один и тот же посетитель. Эффект именованной операции, выполняемой с использованием шаблона посетителя, может зависеть от гость и посетил (двойной диспетчеризации).