Однократная отправка
Предположим, что Node является классом интерфейса, а два подкласса являются конкретными реализациями интерфейса.
Если вы вызываете метод GenerateCode()
для экземпляра узла, фактическая выполняемая операция зависит от типа узла.Это может быть метод либо в VariableRefNode
, либо в AssignmentNode
.То же самое, если вы позвоните PrettyPrint()
.Таким образом, фактическое выполнение операции зависит от имени метода , который вы вызываете, и типа узла .
Double-dispatch
На этот раз Node
позволяет передавать параметр типа NodeVisitor
в его метод, называемый Accept
.В вашей программе, если вы вызываете Accept
для экземпляра узла, фактическая выполняемая операция теперь зависит от типа узла (VariableRefNode
или AssignmentNode
) AND тип экземпляра посетителя, который вы передали в Accept
(TypeCheckingVisitor
или CodeGeneratingVisitor
).