2つの類似しているが基本的に異なるアルゴリズムで使用するNodeクラスを作成しています。それらの間に共通の機能をいくつか持っている私の考えは、共有メソッドとフィールドを持つ抽象ノードクラスを作成することでした。この抽象クラスから2つの具象サブクラスのWaveNodeとEchoNodeを拡張します。抽象クラスから継承するJava
抽象クラスのメソッドの中には、Nodeのインスタンスを扱うものもありますが、このクラスにはサブクラスのインスタンスを使用したいと考えています。つまり、メソッドにWaveNodeまたはEchoNodeを指定すると、別の実装が必要です。だから抽象クラスで実装するのが最善だと思っていたので、両方のサブクラスで実装を使うことができるので、2回タイプする必要はありません。しかし、私がサブクラスにいて、WaveNodeやEchoNodeを扱っているとき、メソッドが抽象Nodeインスタンスを期待するため、コンパイルエラーが発生します。スーパークラスにメソッドを実装する方法があり、スーパークラスを拡張するさまざまなクラスがその実装を使用できます。
例を以下に示します。
Set<Node> getNeighs(){
Set<Node> nei = (Set<Node>) rec.keySet();
nei.remove(this);
return nei;
}
このコードはマップ "rec"を取り、ノードセットにキーセットを入れます。現在のノードを削除し、すべての隣接ノードを返します。したがって、WaveNodeとEchoNodeはまったく同じコードを使用します。唯一の違いは、SetがWaveNodeまたはEchoNodeであることです。スーパークラスのNodeで実装して、2回書くのを節約したかったのです。出来ますか?
編集
コードのいくつかのより多くの投稿:
public abstract class Node {
private final int id;
Map<Node, Boolean> rec = new HashMap<Node, Boolean>();
public Node(int id) {
this.id = id;
}
int getId() {
return id;
}
void addNeigh(Node neigh) {
rec.put(neigh, false);
}
Set<Node> getNeighs() {
Set<Node> nei = (Set<Node>) rec.keySet();
nei.remove(this);
return nei;
}
void printNeighbours() {
Set<Node> nei = getNeighs();
System.out.println(this +" neighbours are: " + nei);
}
Node getSilentNeigh() {
for(Entry<Node, Boolean> entry : rec.entrySet())
{
if(!entry.getValue())
return entry.getKey();
}
return null;
}
public final class TreeNode extends Node {
boolean messageSent = false;
public TreeNode(int id){
super(id);
}
public void sendTok(TreeNode sender){
rec.put(sender, true);
}
今意図したとおり、私はそれが働いていることに注意してください、それはツリーノードへのノードの戻り値の型をキャストしないために私自身のせいでした。しかし、私のコードに対するコメントは、 "あまりにも多すぎる"とか、自分のコードをクリーンアップするのに似たアドバイスを歓迎します。ありがとう
すべてのあなたの実際のコード(非関連部分を削除)、およびエラーメッセージ –
を投稿することができますが示されてきた方法は、しかし、パラメータを取りません。それはどのように 'rec'を受け入れますか? – Zircon
あなたが望むのは、抽象クラスでいくつかの型を使うことです(つまり、 'EchoNode extends AbstractXXX')が、私は確信していません。 –