我已经按照如下方式编写了访客模式,但是我不明白什么是单派和双派。
AFAIK,单调度是根据调用者类型调用方法,而双调度是根据调用者类型和参数类型调用方法。

我想双重派发发生在单类层次结构中,但是为什么访问者类具有两个类层次结构,但仍被视为双重派发。

void floppyDisk::accept(equipmentVisitor* visitor)
{
 visitor->visitFloppyDisk(this);
}

void processor::accept(equipmentVisitor* visitor)
{
 visitor->visitProcessor(this);
}

void computer::accept(equipmentVisitor* visitor)
{
 BOOST_FOREACH(equipment* anEquip, cont)
 {
  anEquip->accept(visitor);
 }

 visitor->visitComputer(this);
}

void visitFloppyDisk(floppyDisk* );
void visitProcessor(processor* );
void visitComputer(computer* );

请使用我提供的示例代码进行说明。

AFAIK,第一次调度发生在调用accept的对象上,第二次调度发生在调用visit方法的对象上。

谢谢。

最佳答案

简而言之,单调度是指方法在一个参数的类型上是多态的(包括隐式this)。双调度是两个参数的多态性。

第一个典型示例是标准虚拟方法,该方法在包含对象的类型上是多态的。第二个可以通过Visitor模式实现。

[更新] 我假设在您的示例中,floppyDiskprocessorcomputer各自继承自一个公共(public)基类,该基类将accept定义为虚拟方法。同样,应在visit*中将equipmentVisitor方法声明为虚拟方法,该方法应具有一些具有不同visit*实现的派生类。 [/更新]

假设以上所述,acceptthisequipmentVisitor上都是多态的。软盘,处理器和计算机都有各自的accept实现,因此,当访问者调用accept时,将根据被调用者的类型调度cal。然后,被调用者会回调访问者类型特定的访问方法,并根据访问者的实际类型调度此调用。

从理论上讲,也可以有三重调度,四重调度等,尽管我从未见过在实践中实现(在本质上不支持双重调度和更高调度的语言中,也就是说-我似乎还记得Smalltalk吗?)。在C++和类似语言中使用Visitor进行的双重调度本身已经非常令人难以置信,因此,三次或更高级别的调度的实现将太复杂而无法在实际应用程序中使用。

09-10 07:41
查看更多