Single-dispatch
Assume Node is an interface class and the two sub classes are concrete implementations of the interface.
If you call GenerateCode()
method on a node instance, the actual operation getting executed depends on the type of the node. It could be the method either in VariableRefNode
or AssignmentNode
. It's the same if you call PrettyPrint()
. So the actual operation getting executed depends on name of the method you are calling and the type of the node.
Double-dispatch
This time the Node
is allowing you to pass a parameter of type NodeVisitor
to its method called Accept
. In your program if you call Accept
on a node instance, the actual operation getting executed now depends on the type of the node (VariableRefNode
or AssignmentNode
) AND the type of the visitor instance you passed into Accept
(TypeCheckingVisitor
or CodeGeneratingVisitor
).
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…