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


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

異なる API クラスを拡張する 2 つのクラスがあります。2つのクラスにはいくつかの重複したメソッド(両方のクラスで同じメソッドが繰り返されています)があり、この重複を削除する方法は?

編集

ApiClass と AnotherApiClass の両方が私の管理下にありません

4

5 に答える 5

2

コードが何であるかに応じて、次のようなことができます。

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

そして、他の 2 つの 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 (および必要に応じて set) のメソッドを作成します。get/set メソッドを public にするので、この方法は好きではありません。別の方法は、リフレクションを使用して何かを行うことですが、それはさらに少なくしたいと思います:-)

于 2010-03-13T08:01:40.343 に答える
1

メンバー変数に依存する重複メソッドは、メンバー変数も重複していることを意味します。これは、クラスが大きすぎるように感じ始めます。メソッドを使用したこれらの特定のメンバー変数は、それらを独自のクラスに抽出し、そのクラスを他のクラスに構成すると、どのようになりますか? 継承よりも構成を優先します。

于 2010-03-13T23:56:33.197 に答える
1

「戦略パターン」の場合のように聞こえます。

class A extends ApiClass {
   private ClassContainingDupMethod strategy;
}

class N extends AnotherApiClass {
   private ClassContainingDupMethod strategy;

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

class ClassContainingDupMethod{
   public dupMethod(){;}
}

それとも、dupMethod は Api クラスから継承されていますか?

于 2010-03-13T08:20:50.347 に答える
0

クラスを1つのオブジェクトに結合してから、他の2つのクラスを使用するすべてのクラスを結合し、単一のクラスを使用するようにコードを変更する必要があります。

于 2010-03-13T23:58:16.570 に答える
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 に答える