2016-04-11 5 views
1

私は脂肪のインタフェースを持っていた:タイプキャスティングを取り除くにはどうすればいいですか?

public interface ISolver { 
    void solve(); 
    String printMsgs();  
    boolean hasSolution();  
    int getLeaderId();  
    void add(Agent agent);  
    void add(int item);  
    void add(String item);  
    void addAll(Agent[] data);  
    void addAll(int[] data);  
    void addAll(String[] data);  
    public void initiateStartState();  
    Agent next();  
    boolean hasNext();  
    public List<Integer> getLeftSenders();  
    public List<Integer> getRightSenders();  
    public List<Integer> getCurrentLeaders();  
    Agent get(int idx);  
} 

2つのクラスは、このインタフェースを継承します。

public class OneDirectSolver extends Solver{ 
    // some code.. 
} 

public class BiDirectSolver extends Solver{ 
    // some code.. 
} 

クラスBiDirectSolverISolverで宣言されたすべてのメソッドを使用しますが、OneDirectSolverはいくつかのメソッドを使用しています。私はインターフェイス分離原理に従いたいと思っています。だから、私はISolverの中に残しました。私はISolver

public interface ISolver { 
    void solve(); 
    String printMsgs(); 
    boolean hasSolution(); 
    int getLeaderId(); 
    void add(Agent agent); 
    void add(int item); 
    void add(String item); 
    void addAll(Agent[] data); 
    void addAll(int[] data); 
    void addAll(String[] data); 
    public void initiateStartState(); 
    Agent next(); 
    boolean hasNext(); 
} 

public interface BiDirectSolvable extends ISolver { 
    public List<Integer> getLeftSenders(); 
    public List<Integer> getRightSenders(); 
    public List<Integer> getCurrentLeaders(); 
    Agent get(int idx); 
} 

を拡張しかし、今、私は別の問題を抱えている別のインターフェイスに移動BiDirectSolverための具体的な方法。私はそれを説明しようとする。だから、私は2つのBiDirectSolverのクライアント、およびOneDirectSolver持っている:私はOneDirectPanelのインスタンスを作成する私のメインクラスのフラグメントを見せたい

public class OneDirectPanel extends MyAbstractPanel { 

    private OneDirectSolvable solver; 

    public void setSolver(OneDirectSolver solver) { 
     this.solver = solver; 
    } 
    //some code.. 
} 

public class BiDirectPanel extends MyAbstractPanel { 

    private BiDirectSolvable solver; 

    public void setSolver(BiDirectSolvable solver) { 
     this.solver = solver; 
    } 
    // some code 
} 

そして今を、BiDirectPanelとISolver:

public class GUI { 
    private ISolver solver; 
    private MyAbstractPanel panelWithPicture; 
    // a lot of code.. 
    if (comboBoxForMode.getSelectedItem().equals("one direct")) { 
     solver = new OneDirectSolver(); 
     panelWithPicture = new OneDirectPanel(); 
     panelWithPicture.setSolver((OneDirectSolver)solver); 
    } else { 
     solver = new BiDirectSolver(); 
     panelWithPicture = new BiDirectPanel(); 
     panelWithPicture.setSolver((BiDirectSolvable)solver); 
    } 
} 

I唯一の解決策を参照してください。

if (comboBoxForMode.getSelectedItem().equals("one direct")) { 
    OneDirectSolver solver = new OneDirectSolver(); 
    panelWithPicture = new OneDirectPanel(); 
    panelWithPicture.setSolver(solver); 
} else { 
    BiDirectSolvable solver = new BiDirectSolver(); 
    panelWithPicture = new BiDirectPanel(); 
    panelWithPicture.setSolver(solver); 
} 

をしかし、それが作成された後、私はソルバーで、いくつかのactiomsを行うために必要があるので、それは私には不可能です。私はすべての場合にそれをする必要があります。だから、私はメインクラスでやる。 したがって、メインクラスでは、タイプがISolverの参照を宣言する必要があります。

UPD: 私はメインクラスのソルバーといくつかのアクションを行うと、すべてのほとんどは、それがOneDirectPanelとBiDirectPanelでソルバーに影響を与えなければなりません。あなたは一時的に、より具体的なランタイム型を必要とするので

答えて

3

、あなたはその後this.solverに割り当てることができます:すべての

private ISolver solver; 
... 
if (comboBoxForMode.getSelectedItem() 
        .equals("one direct")) { 
       OneDirectSolver solver = new OneDirectSolver(); 
       panelWithPicture = new OneDirectPanel(); 
       panelWithPicture.setSolver(solver); 
       this.solver = solver; 
      } else { 
       BiDirectSolvable solver = new BiDirectSolver(); 
       panelWithPicture = new BiDirectPanel(); 
       panelWithPicture.setSolver(solver); 
       this.solver = solver; 
      } 
+0

@JornVemee、申し訳ありませんが、私は重要な細部について忘れました。私は私の質問を更新しました。 –

+0

@АлександрЕлизаровそれはまだ大丈夫です、彼らは同じオブジェクトです。後で割り当てることでコピーするのではなく、単に参照するだけです。 –

+0

ああ、そうです! Excusme、私はこの行をメモしません.solver = solver。それは仕事です。どうもありがとうございました! –

1

最初のあなたはMyAbstractPanelのプロパティとして、あなたのソルバーのインスタンスを置くことができます。あなたはベースソルバプロパティを持っています。

public abstract class MyAbstractPanel { 

     private ISolver solver; 

     public void setSolver(ISolver solver) { 
     this.solver = solver; 
     } 

     public void someWork(){ 
     this.solver.someWork(); 
     } 
    // implement this in child class 
     public abstract void doSomeSpecificWork(); 

    } 

    //assign solver object 
    ISolver solver = new OneDirectSolver(); 

    public class BiDirectPanel extends MyAbstractPanel { 
     public void doSomeSpecificWork(){ 
      ((OneDirectSolver)solver).doSomeSpecificWork(); 
    } 
// some code 

}

ソルバーは、パネルの属性であるので、私はあなたのメインクラスでISolverタイプのreferanceを維持することをお勧めではないと思います。お役に立てれば。

関連する問題