知识卡片

双分派机制让操作同时由调用方和参数的实际类型决定

普通读书笔记卡 · 1993.a.4

内容

Java是单分派语言:调用哪个重载由参数声明类型决定,覆写版本由实际类型决定,两者独立 不能联合判断。[[访问者模式的定义与五个角色]]的accept(visitor)+visitor.visit(this) 突破此限制:accept先用多态确定实际类型,再传入this触发正确重载,使操作同时依赖两者 实际类型,实现双分派。发散:这正是accept总写成visitor.visit(this)的原因。

参考来源

- 位置:《设计模式之禅(第2版)》第25章《访问者模式》(源文件:_epub-src/text/part0117.html) - 结论依据:原文用演员扮演角色的例子说明单分派下`act(Role role)`静态绑定只能识别参数的表面类型,随后给Role接口加上accept方法、内部调用`actor.act(this)`,使得调用哪个act重载同时取决于actor和role的实际类型,说明"双分派意味着得到执行的操作决定于请求的种类和两个接收者的类型……Java是一个支持双分派的单分派语言"。 - 原始内容:重载在编译器期就决定了要调用哪个方法,它是根据role的表面类型而决定调用act(Role role)方法,这是静态绑定;而Actor的执行方法act则是由其实际类型决定的,这是动态绑定……双分派意味着得到执行的操作决定于请求的种类和两个接收者的类型,它是多分派的一个特例。