- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我已经写了访问者模式如下,但我不明白什么是单次和双次分派(dispatch)。AFAIK,单分派(dispatch)是根据调用者类型调用方法,而双分派(dispatch)是根据调用者类型和参数类型调用方法。
我猜双重调度发生在单个类层次结构中,但为什么访问者类具有两个类层次结构但它仍然被视为双重调度。
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,第一次分派(dispatch)发生在调用 accept 的对象上,第二次分派(dispatch)发生在调用 visit 方法的对象上。
谢谢。
最佳答案
简而言之,单分派(dispatch)是指一个方法在一个参数的类型上是多态的(包括隐式的this
)。双重分派(dispatch)是两个参数的多态性。
第一个的典型示例是标准虚方法,它在包含对象的类型上是多态的。第二种可以通过访问者模式实现。
[update] 我假设在您的示例中,floppyDisk
、processor
和 computer
均继承自将 accept
定义为虚方法的通用基类。类似地,visit*
方法应该在 equipmentVisitor
中声明为虚拟方法,它应该有一些具有不同 visit*
实现的派生类。 [/update]
假设以上,accept
在this
和equipmentVisitor
上都是多态的。软盘、处理器和计算机都有自己的accept
实现,所以当访问者调用accept
时,cal会根据被调用者的类型进行调度。然后被调用者回调访问者类型特定的访问方法,并根据访问者的实际类型调度此调用。
理论上也可以有三重、四重等分派(dispatch),尽管我从未在实践中看到过这种实现(在本质上不支持双重和更高分派(dispatch)的语言中,也就是说——我似乎记得 Smalltalk 支持?)。在 C++ 和类似语言中使用 Visitor 进行双重分派(dispatch)本身就已经相当令人难以置信,因此三重和更高分派(dispatch)的实现简直太复杂了,无法在实际应用中使用。
关于c++ - 什么是单次 dispatch 和双重 dispatch ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3262811/
当用户在 uisearchbar 中键入文本时,我正在过滤一个数组,但问题是我有一个警报处理程序,每次调用委托(delegate)时都会触发该处理程序,但我希望警报出现只有一次没有多次......代码
我有一个 HTML5、jQuery 卡片内存游戏,您可以通过一次翻转两张卡片来匹配卡片。我想在两张卡片匹配时播放动画,但因为我已经将 "transform: rotationY(180deg)" 应用
在我的 Jboss-EAP-6.1 中,我部署了一个名为 'myRealWebApp.war' 的 .war我可以使用此网址访问我的应用程序 - http://mywebsite.com/myReal
我是一名优秀的程序员,十分优秀!