私はJavaでGraphデータ構造を実装しようとしています。 は以下のクラスです:Javaの継承を介して異なる実装のalgoロジックを再利用
interface Graph<N,E> {
addNode(N nodeData);
createEdge(N src, N dest, E edgeData);
//and many more api methods
}
class GenericGraph<N,E> implements Graph<N,E> {
Set<Node<N,E>> vertices;
static class Node<N,E> {
private N node;
private Set<Edge<N, E>> adjacencyList;
// getters and setters
}
static class Edge<N, E> {
private E edgeData;
private Node<N, E> src;
private Node<N, E> dest;
// getters and setters
}
//******** API methods implementation*********
Node<N, E> findNode(N nodeData) {
Node<N, E> node = new Node<>(nodeData);
if (vertices.contains(node)) {
for (Node<N, E> tempNode : vertices) {
if (Objects.equals(tempNode, node)) {
node = tempNode;
return node;
}
}
}
return null;
}
Node<N, E> createNode(N nodeData) {
Node<N, E> node = findNode(nodeData);
if (node == null) {
node = new Node<>(nodeData);
vertices.add(node);
}
return node;
}
@Override
public void addNode(N nodeData) {
createNode(nodeData);
}
// other api methods
}
ここ
私は2つの入れ子になったクラス作成しました:ノードとエッジ
1つのグラフオブジェクトは、多くのノードを持つことができます。
1つのノードオブジェクトは、隣接する頂点のリストを持つことができます。
隣接する頂点は
->src node
->dest node
->edge relation bw the two
GenericGraph APIメソッドを実装するためのクラスノードとエッジを使用含まエッジ、と考えられます。
これまですべて正常に動作します。
今私はなどBfsGraph、DfsGraphようGenericGraphよりもいくつかの余分な機能を持っているいくつかの他のクラスを作りたいBFSアルゴが自分のノードのための3つの余分なパラメータ必要
:
->color
->parent
->distance
を私が考えていましたこのようBfsGraphを作成するには:この設計に問題がある
class BfsGraph<N,E> extends GenericGraph<N,E> {
//access public,protected and default methods of GenericGraph
private enum NodeColor {
WHITE, GRAY, BLACK;
}
static class BfsNode<N,E> extends GenericGraph.Node<N,E> {
private NodeColor color = NodeColor.WHITE;
private Integer distance = Integer.MAX_VALUE;
private Node<N, E> parent;
BfsNode(N node) {
super(node);
}
}
}
を、私はGenericGraphから各メソッドをコピーしてBfsGraphのACCでそれを再実装する必要があります(ノードはBfsNodeに変わります)。
将来私は他の実装をしたい場合は、すべてのメソッドをコピーして変更する必要があります。
GenericGraphで記述されたアルゴリズム/ロジックは、再利用しないで再利用する必要があります。
私に新しい解決策または変更を提案してください。サブクラスは二つのことをコントロールできるようにする必要がありようなあなたの記述から
( 'BfsGraph'は、オフ_sounds_ながら)アルゴリズムを書き換える代わりに(' Generic') 'Graph'(とまったく同じことをやっていない)から、それを再利用する_one_例を提供してください。 (あなたは 'super'を使ってメンバーのアクセス/呼び出しを修飾することができます。) – greybeard