2013-01-25 43 views
0

我不确定是否对双派遣有错误的想法。但是,这是我的想法:Java中的双派遣

class A{ 
    void testA(B obj){ 
     System.out.println("A-Parent"); 
      obj.testB(); 
    } 
} 


class AChild extends A{ 
    void testA(B obj){ 
     System.out.println("A-Child"); 
     obj.testB(); 
    } 
} 


class B{ 
    void testB(){ 
     System.out.println("B-Parent"); 
    } 
} 


class BChild extends B{ 
    void testB(){ 
     System.out.println("B-Child"); 
    } 
} 

class Launcher{ 
    public static void main(){ 
    A objA = new AChild(); 
    B objB = new BChild(); 

    objA.testA(objB); 
    } 
} 

What I expected: 

A-Child 
B-Parent 

Actual output: 

A-Child 
B-Child // How ??????? 

我认为Java的运行期间正确解析objA到Achild而参数是在编译时解析为B,由于Java类单diapatch。请告诉我我哪里错了?

+0

改变,在记事本中写入代码的危险:) – broun

+2

考虑改变你的主要方法也!!! –

+0

在这里找到问题。我认为,因为参数是静态解决的,所得到的方法将使用解析类中定义的方法。但是java总是在运行时解析接收者对象。 http://java.dzone.com/articles/multiple-dispatch-fix-some – broun

回答

-3

您需要使用http://en.wikipedia.org/wiki/Visitor_pattern来实现java中的双重调度。

+0

我明白,访问者模式是一种黑客来支持java中的双重调度。我的问题是关于double dispatch和java处理场景的方式。感谢您的评论。 – broun

+0

它在运行时变形 –

1

不明白为什么'B-父'应打印,而不是'B-儿童' 的原因

 B objB = new BChild(); 
    objA.testA(objB); 

objB居然有B.所以的孩子的一个实例B-Child将被打印。所以这是运行时绑定或Java中的多态性功能在行动:)