双重调度如何在访客模式中工作?

我正在调查与访问者模式相关的其他问题,但无法理解访问者模式中双重调度的实现。

请参阅访问者模式链接

双重调度如何在访客模式中工作?

元素对象的accept方法接收一个访问者对象,并在访问者对象上调用visit方法。 由于访问者对象具有多个visit方法,因此基于元素类型调用适当的visit方法。 这里我们有两个调用( double dispatch ),它指定元素的元素和正确的操作 (基于它的类型)。

单分派

单一派遣

假设Node是一个接口类,两个子类是接口的具体实现。

如果在节点实例上调用GenerateCode()方法,则执行的实际操作取决于节点的类型 。 它可以是VariableRefNodeAssignmentNode的方法。 如果你打电话给PrettyPrint()它也是一样的。 因此,执行的实际操作取决于您调用的方法的名称节点类型

双调度

节点游客

这次Node允许您将NodeVisitor类型的参数传递给名为Accept方法。 在程序中,如果在节点实例上调用Accept ,则现在执行的实际操作取决于节点类型VariableRefNodeAssignmentNode )以及传递给AcceptTypeCheckingVisitorTypeCheckingVisitor )的访问者实例的类型。

好吧,这是该文章的相关引用:

访客实施“双重调度”。 OO消息通常表现为“单一调度” – 执行的操作取决于:请求的名称和接收器的类型。 在“双重调度”中,执行的操作取决于:请求的名称,以及TWO接收器的类型(访问者的类型和它访问的元素的类型)。

这实质上意味着不同的访问者可以访问相同类型,同一访问者可以访问不同类型。 使用访问者模式执行的命名操作的效果可能取决于访问者访问者 (双重调度)。