2

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> {}

さて、これは意図したとおりに機能しているように見えますが、ちょっと奇妙に感じます...この状況は比較的一般的であるため、より簡単な解決策が見つからないことに驚きました。これをどのように解決しますか?私が逃したより良い/より単純なアプローチはありますか?または、上記は実行可能なアプローチですか?

4

2 に答える 2

2

あなたのアプローチに問題はありません。実際、次のようないくつかの標準インターフェースはComparable、まさにこのように定義されています。

public class Fruit implements Comparable<Fruit> {
             ^^^^^                       ^^^^^
于 2013-01-04T11:17:57.790 に答える
-1

ノードのネイバーが同じタイプであることを強制する場合は、次を使用できます。

class DefaultNode<T extends DefaultNode<T>> implements INode

ただし、インターフェイスをジェネリックにします(INodeではなくNodeと呼びます)。

于 2013-01-04T11:38:28.903 に答える