2010-03-13 99 views
1
class A extends ApiClass 
{ 
    public void duplicateMethod() 
    { 
    } 
}  


class B extends AnotherApiClass 
{ 
    public void duplicateMethod() 
    { 
    } 
} 

我有兩個類,它們擴展了不同的api類。這兩個類有一些重複的 方法(在這兩個類中重複相同的方法)以及如何刪除此重複?刪除java中的重複代碼

編輯

兩個ApiClass和AnotherApiClass不受我控制

+0

如果AnotherApiClass受你控制,你可以從ApiClass繼承它嗎? – BeWarned 2010-03-14 00:04:03

+0

您的方法依賴於API類或您自己的類還是兩者的成員變量? – 2010-03-14 00:31:04

+0

@Carl Manaster變量在我的課堂上。 – 2010-03-14 04:03:41

回答

1

聽起來像是「戰略模式」的案例。

class A extends ApiClass { 
    private ClassContainingDupMethod strategy; 
} 

class N extends AnotherApiClass { 
    private ClassContainingDupMethod strategy; 

    public methodCallingDupMethod(){ 
     strategy.dupMethod(); 
    } 
} 

class ClassContainingDupMethod{ 
    public dupMethod(){;} 
} 

或者是從Api類中侵入的dupMethod?

0
class BaseApiClass 
{ 
    public void duplicateMethod() 
    { 
    } 
} 

class ApiClass extends BaseApiClass 
{ 
} 
class AnotherApiClass extends BaseApiClass 
{ 
} 

class A extends ApiClass 
{ 
}  

class B extends AnotherApiClass 
{ 
} 
1

下,根據不同的代碼,你可以做這樣的事情是什麼:

public class Util 
{ 
    public static void duplicateMethod() 
    { 
     // code goes here 
    } 
} 

,然後纔有其他兩個duplicateMethods調用那個。所以代碼不會被複制,但方法名稱和對Util.duplicateMethod的調用將會是。

如果Util.duplicateMethod中的代碼需要訪問A類和B類的實例/類變量,那麼它不會很好地工作,但它可能會完成(如果需要,請告訴我)。

EDIT(基於評論):

用實例變量它變得不太漂亮......但可以做到的。例如:

interface X 
{ 
    int getVar(); 
    void setVar(A a); 
} 

class A 
    extends ApiClass 
    implements X 
{ 
} 

class B 
    extends AnotherApiClass 
    implements X 
{ 
} 

class Util 
{ 
    public static void duplicateMethod(X x) 
    { 
     int val = x.getVal(); 
     x.setVal(val + 1); 
    } 
} 

因此,對於每個需要訪問的變量,您都會爲get(並在必要時設置)創建一個方法。我不喜歡這種方式,因爲它使get/set方法公開,這可能意味着你正在使可用的東西不想被使用。另一種方法是用反射做一些事情,但我希望更少一些:-)

+0

是的方法需要訪問實例變量 – 2010-03-13 08:05:00

1

依賴於成員變量的重複方法也意味着重複的成員變量 - 並且開始聞起來像太大的類。那些特定的成員變量和方法是什麼樣子的,如果你要將它們提取到自己的類中,然後將該類組合到其他類中? Prefer composition over inheritance

0

您需要將類組合成一個對象,然後使用其他兩個類將所有類修改爲使用單個類。