3
class A extends ApiClass
{
   public void duplicateMethod()
   {
   }
}    


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

我有两个类扩展了不同的 api 类。这两个类有一些重复的方法(两个类中重复相同的方法),如何删除这种重复?

编辑

ApiClass 和 AnotherApiClass 都不受我控制

4

5 回答 5

2

根据代码是什么,您可以执行以下操作:

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

然后让另外两个 duplicateMethods 调用那个。所以代码不会重复,但方法名称和对 Util.duplicateMethod 的调用会重复。

如果 Util.duplicateMethod 中的代码需要访问 A 和 B 类的实例/类变量,它的工作效果不会很好,但它可能会完成(如果需要,请告诉我)。

编辑(基于评论):

使用实例变量它变得不那么漂亮......但可以完成。就像是:

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 方法,这可能意味着您正在提供您不想使用的东西。另一种方法是通过反射来做一些事情,但我更喜欢这样:-)

于 2010-03-13T08:01:40.343 回答
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 ?

于 2010-03-13T08:20:50.347 回答
1

依赖于成员变量的重复方法也意味着重复的成员变量——这开始闻起来像过大的类。如果您要将这些特定的成员变量与方法一起提取到它们自己的类中,然后将该类组合到您的其他类中,它们会是什么样子? 更喜欢组合而不是继承

于 2010-03-13T23:56:33.197 回答
0
class BaseApiClass
{
   public void duplicateMethod()
   {
   }
}

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

class A extends ApiClass
{
}    

class B extends AnotherApiClass
{
}
于 2010-03-13T08:01:10.903 回答
0

您需要将这些类组合成一个对象,然后使用其他两个类的所有类,修改它们的代码以使用单个类。

于 2010-03-13T23:58:16.570 回答