複数回実装されるデータ構造を設計する必要があり、問題が発生しました。
私のデータ構造には複数のバージョンが必要なので、すべての実装の基礎となる抽象クラスを作成しました。ただし、データ構造には特定のパーツのセットビューも必要です。
問題は次のようになります。セットには、データ構造の実装に応じて異なる実装が必要です: HashSet または Collections.SingletonSet のいずれかです。次に、2 つの実装データ構造は、アイテムがセットに追加またはセットから削除されたときに、これらのビットを拡張して追加のタスクを実行します。ただし、抽象的なデータ構造には、この余分な作業が行われないように、このセットから要素を内部的に削除する方法も必要です。このために、保護されたメソッドをセットに追加したいのですが、できません!
説明のために、作成しているデータ構造のタイプに関連するサンプル コードを次に示します。
public abstract class AbstractEdge {
public abstract AbstractSetView destination(); //Gives a subclass of AbstractSetView in implementations.
public void doStuff() {
destination().removeInternal(foo);
}
public abstract class AbstractSetView implements Set<Vertex> {
protected abstract void removeInternal(Vertex vert);
}
}
public class Edge extends AbstractEdge {
public SetView destination() {
return new SetView();
}
public class SetView extends AbstractSetView,Collections.SingletonSet<Vertex> { //Doesn't work this way.
protected void removeInternal(Vertex vert) {
//Do stuff.
}
}
}
public class HyperEdge extends AbstractEdge {
public SetView destination() {
return new SetView();
}
public class SetView extends AbstractSetView,HashSet<Vertex> { //Doesn't work this way.
protected void removeInternal(Vertex vert) {
//Do stuff.
}
}
}
これらは私が検討したオプションです:
- 上記のように、複数のクラスからの拡張は許可されていません。
- AbstractSetView をインターフェースにすると、removeInternal() メソッドが公開されますが、これは望ましくありません。
- SetView を AbstractSetView のみ拡張し、すべてを自分で実装するようにします... 2 回。しかし、これには基本的に HashSet と SingletonSet の実装を内部クラスとして含める必要があり、これは非常に見苦しいものです。
Java の設計者は、組み込みの Set 実装を使用できるようにするために、これを回避する方法を作ったのでしょうか? 私は何を見落としていますか?