質問

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


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

私は別のAPIクラスを拡張する2つのクラスを持っています。 2クラスは、いくつかの重複があります メソッド(両方のクラスで繰り返し同じ方法)とどのようにこの重複を削除するには?

編集

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

役に立ちましたか?

解決

"Strategyパターン" のためのケースのような音ます。

class A extends ApiClass {
   private ClassContainingDupMethod strategy;
}

class N extends AnotherApiClass {
   private ClassContainingDupMethod strategy;

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

class ClassContainingDupMethod{
   public dupMethod(){;}
}

またはdupMethodは、APIクラスからinhertedされる?

他のヒント

のコードは、あなたのような何かができるが何であるかに応じて、

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

、その後、ちょうど他の2 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 / setメソッドを公開するので、この方法が好きではありません。代替は、反射して何かをするだろうが、私はそれがさらに小さくたい: - )

メンバ変数に依存している重複した方法は、あまりにも、重複したメンバ変数を意味 - それはあまりにも、大きなクラスのようなにおいを開始します。あなたは、自分のクラスにそれらを抽出した後、あなたの他のクラスにそのクラスを構成した場合にどのようなそれらの特定のメンバ変数は、方法(複数可)と、のように見えるのでしょうか? 継承する上に組成物を好む。

class BaseApiClass
{
   public void duplicateMethod()
   {
   }
}

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

class A extends ApiClass
{
}    

class B extends AnotherApiClass
{
}

あなたは、単一のクラスを使用するために1つのオブジェクトにクラスを結合し、他の二つのクラス第使用して、すべてのクラスが、自分のコードを変更する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top