2017-05-03 4 views
3

私のコードの構造を設定するのが難しいです。 1つのプロジェクトでは、私はLeftCellRightCellの2つのクラスを持ち、両方ともクラスCellを拡張しています。さて、コードの重複を避けるために、これらのオブジェクトを他の複数のプロジェクトで使用したいと思います。問題は、プロジェクトごとに異なるこれらのオブジェクト(特にCellオブジェクト)に特別な機能を追加したいということです。コードの重複を減らすための継承階層の変更

void draw()メソッドを使用してCellオブジェクトをビジュアル化する新しいプロジェクトを作成するとします。

class CellProject1 extends Cell { 
    void draw() {} 
} 

問題はどのLeftCell/RightCell私が作成したオブジェクトは、当然のことながら、このdraw()メソッドへのアクセスを持っていないということです。私が最初に考えたCellクラスを拡張し、draw()方法を含む新しいCellProject1クラスを作成することでした。私が実行しているプロジェクトに応じて

Cell 
    CellProjectX 
     LeftCell 
     RightCell 

:に

Cell 
    LeftCell 
    RightCell 

:私は何とかそれから変化するようにクラス階層でCellサブクラスを圧迫したいと思います。私はジェネリックで遊んだが、動かすことはできない。すべての提案は大歓迎です!

答えて

0

問題は、私が作成したLeftCell/RightCellオブジェクトは、このdraw()メソッドにアクセスすることはできませ もちろんやるということです。

子クラスに固有のメソッドは、それがわからない親インスタンスで呼び出されることはもちろんありません。

あなたの条件1つのプロジェクトでは、コードの重複 を減らすために変更すること

継承階層であるので、私は2つのクラスLeftCellとRightCell、クラスのセルを拡張し、両方の を持っています。 さて、コードの重複を避けるために、私は 複数の他のプロジェクト

私はあなたが少し違うものを作るべきだと思い

でこれらのオブジェクトを使用します。

あなたの例のようにLeftCellRightCellを複製するクラスの可能性はない組み合わせの数を爆発回避したい場合:

Cell 
    CellProjectX 
     LeftCell 
     RightCell 

最終的に完了することができます

Cell 
    CellProjectY 
     LeftCell 
     RightCell 

Cell 
    CellProjectZ 
     LeftCell 
     RightCell 

特定のプロジェクトCellの実装を作成するために、継承よりも構成を優先してください。一般的なセル構造については

Cellサブクラスは、任意のCellのための共通のメソッドを定義し、あなたはそれのための一般的な実装を定義AbstractCellクラスを持つことができCellインターフェースである可能性があります。

public interface Cell{ 
    int getValue(); 
    void setValue(int value); 
} 


public abstract class AbstractCell implements Cell{ 
     ... 
} 

次にあなたがAbstractCellを拡張することによりRightCellLeftCellを定義することができます。プロジェクトへの特異的な細胞の実装については

public class RightCell extends AbstractCell { 
     ... 
} 

public class LeftCell extends AbstractCell { 
     ... 
} 

を:

今あなたが作成することができ、特定のプロジェクトにそれをCellインスタンス(最終的にはLeftCellまたはフードの下にある特定のプロジェクト具体的なクラスのCellインターフェイスを実装するために使用されます。
特定の実装では、プロジェクトに固有の必要なメソッドを追加できます。
例えば:

CellProject1 leftCell = new CellProject1(new LeftCell()); 
CellProject1 rightCell = new CellProject1(new RightCell()); 
leftCell.draw(); 
rightCell.draw(); 

そして、あなたが書くことができる具体的なwrite()方法、でCellProject2のインスタンスを使用して別のプロジェクトで:

CellProject2 leftCell = new CellProject2(new LeftCell()); 
CellProject2 rightCell = new CellProject2(new RightCell()); 
leftCell.write(); 
rightCell.write(); 

class CellProject1 implements Cell { 

    private Cell cell; 

    CellProject1 (Cell cell){ 
     this.cell = cell; 
    } 

    public int getValue(){ 
     cell.getValue(); 
    } 

    public void setValue(int value){ 
     cell.setValue(value); 
    } 

    public void draw(){ 
    ... 
    } 

} 

あなたはとてもそのようなCellProject1インスタンスを作成することができます

0

問題は、プロジェクトごとに異なるこれらのオブジェクト(特にCellオブジェクト)に余分な機能を追加したいということです。

私はインターフェイスを作成することをお勧めしているCell実装、Cellは抽象クラスである場合は特に、あなたがしたいメソッドを実装するために、その子クラスを許可します。

public interface Features { 
    ... 
} 

public abstract class Cell implements Features { 
    ... 
} 
関連する問題