2013-11-20 58 views
0

請考慮以下情況。我想要根據或class C從這裏撥打電話的位置獲得methoddA()methoddA()的不同行爲。如何實現這一點,重寫方法在這裏不起作用。構圖覆蓋方法

class A 
{ 
    public methodA(){ //some code } 
} 

class B 
{ 
    A a = new A() 
    public methodB() 
    { 
     a.methodA(); 
    } 
} 

class C 
{ 
    B b = new B(); 

    public methodC() 
    { 
     b.methodB(); 
    } 
} 

class D 
{ 
    B b = new B(); 

    public methodD() 
    { 
     b.methodB(); 
    } 
} 
+0

你想實現什麼樣的不同行爲? –

+0

可能是一些不同的代碼,如果從類C中調用,並且從類D調用一些不同的代碼。 – eatSleepCode

+0

爲什麼要這樣?如果你想要不同的行爲取決於函數的調用,也許你可以調用不同的方法? – user902383

回答

0

這裏你需要的是多態性。首先創建一個接口 -

public interface MyInterface 
{ 
    void methodA(); 
} 

然後創建兩個不同的實現了兩個不同的行爲 -

public class First implements MyInterface 
{ 
    public void methodA() { 
     // first behavior 
    } 
} 

public class Second implements MyInterface 
{ 
    public void methodA() { 
     // second behavior 
    } 
} 

現在創建您的其他類如下 -

class B 
{ 
    public void methodB(MyInterface m) 
    { 
     m.methodA(); 
    } 
} 

class C 
{ 
    B b = new B(); 

    public void methodC() 
    { 
     // Pass the corresponding behavior implementation 
     // as argument here. 
     b.methodB(new First()); 
    } 
} 

class D 
{ 
    B b = new B(); 

    public void methodD() 
    { 
     // Pass the second behavior implementation. 
     b.methodB(new Second()); 
    } 
} 

這將導致更多可維護的代碼。

0

您可以通過類名來你的方法作爲一個字符串,並以你的方法檢查

if(className.equals("A") // or use isInstanceOf() if you are passing objects of A/B 
//do something 

if(className.equals("B") 
// do something else. 

爲什麼你需要兩種不同的實現? 這個簡單的把戲可以爲你工作......請糾正我,如果我錯了......

0

我下面的代碼我修改了類A1和類B1的方法簽名接受對象和類似的同時從類調用方法C和D類,無論我們稱之爲B1類方法,都將此作爲參考。在A1類中,我們可以檢查instanceof對象並確定調用類。

class A1 
{ 
    public void methodA(Object c){ //some code } 
     if (D.class.isInstance(c)){ 
      System.out.println("Called from Class D"); 
     }else if (C.class.isInstance(c)){ 
      System.out.println("Called from Class c"); 
     }else{ 
      System.out.println("Called from Some diff class"); 
     } 
    } 

} 

class B1 
{ 
    A1 a = new A1(); 
    public void methodB(Object c) 
    { 
     a.methodA(c); 
    } 
} 

class C 
{ 
    B1 b = new B1(); 

    public void methodC() 
    { 
     b.methodB(this); 
    } 
} 

class D 
{ 
    B1 b = new B1(); 

    public void methodD() 
    { 
     b.methodB(this); 
    } 
} 


public class Testnew{ 
    public static void main(String args[]){ 
     D d = new D(); 
     d.methodD(); 

     C c = new C(); 
     c.methodC(); 

     B1 b = new B1(); 
     b.methodB(b); 
    } 
} 
+0

以這種方式使用'instanceof'幾乎總是會產生代碼異味。有更好的設計方案。 –