2010-03-13 130 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

您需要将类组合成一个对象,然后使用其他两个类将所有类修改为使用单个类。