2012-12-22 37 views
1

考慮下面的類調用使用方法的參數,它是類

Class A{ 
    public void m1(){ 
      System.out.println("test in A.m1()"); 
    } 

    public void m2(){ 
      //do something a 
    } 
} 


Class B{ 
    public void m1(){ 
      //do something b 
    } 

    public void m2(){ 
      //do something b 
    } 
} 


Class C{ 
    public void m1(){ 
      //do something c 
    } 

    public void m2(){ 
      //do something c 
    } 
} 

Class T{ 
    public void m3(Object obj1){ 
      obj1.m1(); 
    } 

    public void m4(Object obj1){ 
      A a=new A(); 
      m3(a); 
    } 


} 

所以現在我的問題是一個對象類的方法,有什麼辦法,我可以送一個開放的對象一種將檢測它是什麼類型的對象並調用該對象類的方法的方法。在這個例子中,我希望能看到輸出:"test in A.m1()"

+0

這是訪問者模式的任務。 – EJP

回答

3

您可以使用Java的Reflection API查詢任意對象,看它是否有一個名爲m1m2方法,然後調用它。但這很醜陋。

有沒有什麼能阻止你使用接口?下面的示例(其中「...」表示要放置具體實現的位置):

interface MyMethods { 
    public void m1(); 
    public void m2(); 
} 

class A implements MyMethods { 
    public void m1() { ... } 
    public void m2() { ... } 
} 

class B implements MyMethods { 
    ... 
} 

class C implements MyMethods { 
    ... 
} 

class T { 
    public void m3(MyMethods obj1) { 
    obj1.m1(); 
    } 

    public void m4(Object obj1) { 
    // Call m3 three times with different object instance types... 
    A a = new A(); 
    m3(a); 
    B b = new B(); 
    m3(b); 
    C c = new C(); 
    m3(c); 
    } 
} 
+0

我知道如何在這種情況下使用接口。但我想知道是否可以按我解釋的方式完成。謝謝你的回答。 – LynAs

+0

我認爲你所描述的本質上是鴨子打字,並且是動態類型語言的一個特徵。如果沒有一點努力來解決問題,Java不會允許這樣做。 – Ash

相關問題