Как работает double dispatch в шаблоне посетителей?
Я изучал другие вопросы, связанные с шаблоном посетителя, но не мог понять реализацию двойной отправки в шаблоне посетителя.
пожалуйста, обратитесь к ссылке Шаблон Visitor
как двойная отправка работает в шаблоне посетителя?
3 ответов
объект элемента accept
метод получает объект посетителя и вызывает visit
метод на объекте посетителя. Поскольку объект посетителя имеет несколько visit
методы, основанные на типе элемента соответствующий visit
метод называется. Здесь у нас есть два звонка (двойной диспетчеризации), что указать элемент и справа операция для элемента (на основе его типа).
один-диспетчерского
предположим, что узел является классом интерфейса, а два подкласса являются конкретными реализациями интерфейса.
если вы называете GenerateCode()
метод на экземпляре узла, фактическое выполнение операции зависит от тип узла. Это может быть метод либо в VariableRefNode
или AssignmentNode
. То же самое, если вы позвоните PrettyPrint()
. Таким образом, фактическое выполнение операции зависит от название метода вы звоните и тип узла.
двойной отправки
в этот раз Node
позволяет передать параметр типа NodeVisitor
его метод, называемый Accept
. В вашей программе, если вы вызываете Accept
на экземпляре узла фактическая операция, выполняемая теперь, зависит от тип узла (VariableRefNode
или AssignmentNode
) и тип экземпляра посетителя, который вы передали в Accept
(TypeCheckingVisitor
или CodeGeneratingVisitor
).
Ну, вот соответствующая цитата из этой статьи:
посетитель реализует "double dispatch". OO сообщения обычно манифестируют "одиночную отправку" - выполняемая операция зависит от: имени запроса и типа получателя. В "двойной отправке" выполняемая операция зависит от: имени запроса и типа двух получателей (типа посетителя и типа элемента, который он посещает).
Это по существу означает, что разные посетители могут посещать один и тот же тип, и разные типы могут посещать один и тот же посетитель. Эффект именованной операции, выполняемой с использованием шаблона посетителя, может зависеть от гость и посетил (двойной диспетчеризации).