2013-01-25 39 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中的多態性功能在行動:)