2016-10-17 5 views
1

私は2つの類似したクラスオブジェクトを持っています。私は第2クラスのオブジェクトのために再利用したいファーストクラスのオブジェクトのためにいくつかのメソッドを持っていますが、私はどのようにして複製メソッドを記述したくないのか分かりません。再利用の検証方法。オブジェクトを変換する

私はどのように考えているかを示す例を抽出して簡略化しました。

ファーストクラス

public class FirstClass { 
    int number; 

    public int getNumber() { 
     return number; 
    } 

    public void setNumber(int number) { 
     this.number = number; 
    } 
    ... 
} 

セカンドクラス

public class SecondClass { 
     int number; 

     public int getNumber() { 
      return number; 
     } 

     public void setNumber(int number) { 
      this.number = number; 
     } 
     ... 
    } 

サードクラス

public class Main { 
    public static void main(String[] args) { 
     FirstClass firstClass = new FirstClass(); 
     firstClass.setNumber(5); 
     SecondClass secondClass = new SecondClass(); 
     secondClass.setNumber(5); 

     numberIsFive(firstClass); 
     numberIsFive(secondClass); 
    } 

    public void numberIsFive(Object myObject){ 
     if(myObject instanceof FirstClass){ 
      myObject = (FirstClass)myObject; 
     }else if(myObject instanceof SecondClass){ 
      myObject = (SecondClass)myObject; 
     } 

     if(myObject.getNumber() == 5){ 
      System.out.println("is five"); 
     }else{ 
      System.out.println("is not five"); 
     } 
     ... 
    } 
} 

なしnumberIsIFive(firsclass.getNumberは())私が使用方法以来のオプションではありませんはるかに多くのバリデーションがあります。

interface IntValueHolder { 
    int getNumber(); 
    void setNumber(int value); 
} 

class IntValueHolderImpl implements IntValueHolder { ... 

そしてドロップ」だろう:「オーバーエンジニアリング」かもしれませんが、一般的にはあなたのような、ここに構図の方になります。このケースでは、事前

答えて

4

感謝あなたのクラスの両方で現在持っているコードではなく、どちらのクラスも(何らかの形で)IntValueHolderのインスタンスを持っています。

あなたのケースでは、2つのクラスがその "一般的な"インターフェースIntValueHolderを単純に実装することがより適切かもしれません - 少なくとも繰り返されるinstanceof呼び出しとダウンキャスト(特定のクラスまで)を避けるためです。

編集:もちろん、別のオプションは、ここで継承を使用することです - あなたの2つのクラスは、この動作を提供するいくつかの基本クラスから派生させる。しかし、コードの重複を避けるために継承を使用することは、ほとんどの場合、悪い考えです。クラスは、コードの行を保存するのではなく、基になるモデルで "意味"を持つため、互いに継承します。あなたのクラスは次のようになります。そして、

public interface Number { 

    int get(); 

    void set(int n); 
} 

+0

継承の使用はどうですか? – dcalap

+1

私はその考えに私の答えを更新しました。 – GhostCat

+0

すべての回答は本当にありがとうございます。私はこれを使用して解決策に最も近いものだったので、これを厳しく受け入れました。 – Benny

1

あなたはinterfaceを作成し、両方のクラスでそれを適用する必要があり、その後、あなたの検証方法ではなくObject

例のインタフェースを受け取る作る

public class FirstClass implements Number { 

    int number; 

    @Override 
    public int get() { 
     return number; 
    } 

    @Override 
    public void set(int n) { 
     this.number = n; 
    } 
} 

そして、あなたの検証メソッド番号を受け取ります。

public void numberIsFive(Number myNumber){ 
... 
} 
+0

私はあなたがpublic void numberIsFive(Number myNumber){ – maxpovver

2

これを続行する前に、他のオブジェクト指向プログラミングの概念を自分で読むことをお勧めします。この特定のケースを中心に

、あなたのFirstClassSecondClassのすべての一般的なフィールドおよびメソッドを含むよう

public class BaseClass { 
    int number; 

    public int getNumber() { 
     return number; 
    } 

    public void setNumber(int number) { 
     this.number = number; 
    } 
} 

として基本クラスを作成する必要があります。次に、現在の2つのクラスからそれらのメソッドを削除し、それらをBaseClass機能を与えるためにpublic class FirstClass extends BaseClassとして作成します。

最後に、バリデーションメソッドを変更して、ベースクラスに属するオブジェクトのみをこのようにして受け入れる必要があります。public void numberIsFive(BaseClass myObject)(一般的には、特定のクラスを受け入れることでエラーが大幅に減ります。古いオブジェクトを受け入れるよりもむしろメソッドです)。

編集:他の回答者も正しく、継承も有効な解決策です。どのアプリケーションを使用するかは、アプリケーションのコンテキストでより意味を成すものに依存します。

関連する問題