我不确定我是否对双重调度有错误的想法。但这就是我的想法:
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 ???????
由于Javas Single diapatch,我认为Java在运行期间正确解析了对Achild的objA,而参数在编译期间被解析为B.请告诉我哪里弄错了?
答案 0 :(得分:1)
不明白为什么应该打印'B-Parent'而不是'B-Child'
B objB = new BChild();
objA.testA(objB);
objB 实际上有一个B的孩子实例。所以 B-Child 会被打印出来。所以这是Java的运行时绑定或多态性功能:)
答案 1 :(得分:-3)
您需要使用http://en.wikipedia.org/wiki/Visitor_pattern在java中实现双重调度。