Javaでノードからなるグラフを作りたい。グラフクラスはさまざまな人々とさまざまなアルゴリズムによって使用されるため、ケースごとにさまざまなノードクラスが必要にDefaultNode
なりSpecialNode extends DefaultNode
ます。
ここDefaultNode
で、ノードが機能するために必要なすべての一般的なもの、たとえば直接隣接のリストなどを含めたいと思います。だから私はこのリストをDefaultNode
:に実装します
List<DefaultNode> neighbours = new ArrayList<DefaultNode>();
私の問題は、明らかにこのリストもSpecialNode
クラスに必要なことですが、そこにはSpecialNodesが含まれていて返されるはずです。もちろん、から継承するすべてのクラスのリストとメソッドをaddNeighbour()
上書きすることはできますが、それは冗長であり、OOPがどのように機能するかではないようです。これは(C ++のように)テンプレートを使用するのに最適なケースだと思いますが、Javaにはそのような構造がないため、Genericsが残ります。getNeighbours()
DefaultNode
私がこれまでに思いついた解決策は次のとおりです。
interface INode {}
class DefaultNode<T extends INode> implements INode {
List<T> neighbours;
List<T> getNeighbours(){}
void addNeighbour(T node){}
}
ここで、<T extends INode>
括弧はこのノードの可能なネイバーを示しています。だからSpecialNode
私はするだろう:
class SpecialNode extends DefaultNode<SpecialNode> {}
さて、これは意図したとおりに機能しているように見えますが、ちょっと奇妙に感じます...この状況は比較的一般的であるため、より簡単な解決策が見つからないことに驚きました。これをどのように解決しますか?私が逃したより良い/より単純なアプローチはありますか?または、上記は実行可能なアプローチですか?