java双分枝_Java模拟 双分派Double Dispatch-设计模式-火龙果软件工程

本节应用命令模式,在Java中模拟双分派。理解本节后,访问者模式(visitor

pattern)手到擒来。

1. 单分派

分派/ dispatch是指如何给一个消息绑定其方法体。Java、C#等仅仅支持单分派(singledispatch)而不支持双分派(double

dispatch)。【相关概念,参考《设计模式.5.11访问者模式》p223】

对于消息a.foo(b),假设有父类X及其两个子类X1、X2,a声明为X类型变量;有父类Y及其两个子类Y1、Y2,b声明为Y类型变量,而且X、X1和X2都各自准备了foo(Y)、foo(Y1)和foo(Y2)方法,请问a.foo(b)将执行的方法体是3*3=9个方法中的哪一个?

当前主流的面向对象语言如C++、Java、C#等,仅仅支持单分派(singledispatch)。例程3-18中,目前可以不管a.foo(b)中的参数b,我们仅仅看消息a.m()好了。假定X、X1和X2都各自准备了m(),则a.m()按照a的实际类型绑定其override的方法体,这就是面向对象中的动态绑定。

所谓的双分派,则是希望a.foo(b)能够①按照a的实际类型绑定其override的方法体,而且能够②按照b的实际类型绑定其重载的方法即foo(Y)、foo(Y1)、foo(Y2)中的适当方法体。显然,Java不支持后者——即不支持双分派。Java在编译时,就为foo(b)按照b的声明类型静态绑定了foo(Y)这个的方法体。Java重载方法的匹配算法,请参考【编程导论·2.3.1】。

例程 3 18 单分派

package method.command.doubleDispatch;

import static tool.Print.*;

public abstract class X{

public void m(){

pln(" X.m()");

}

public void foo(X x){

p(" X.foo(X)-"); x.m();

}

public void foo(X1 x1){

p(" X.foo(X1)-"); x1.m();

}// foo(X2 x2) 略

}//子类X1、X2的代码,略

package method.command.doubleDispatch;

import tool.God;

public class Test{

public static void X单分派(){

X a = (X)God.create("3-18-X1");

X b = (X)God.create("3-18-X2");

a.m(); a.foo(b);

<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值