私は脂肪のインタフェースを持っていた:タイプキャスティングを取り除くにはどうすればいいですか?
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..
}
クラスBiDirectSolver
はISolver
で宣言されたすべてのメソッドを使用しますが、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でソルバーに影響を与えなければなりません。あなたは一時的に、より具体的なランタイム型を必要とするので
@JornVemee、申し訳ありませんが、私は重要な細部について忘れました。私は私の質問を更新しました。 –
@АлександрЕлизаровそれはまだ大丈夫です、彼らは同じオブジェクトです。後で割り当てることでコピーするのではなく、単に参照するだけです。 –
ああ、そうです! Excusme、私はこの行をメモしません.solver = solver。それは仕事です。どうもありがとうございました! –