2

我想用 Java 制作一个由节点组成的图表。图类将被不同的人和不同的算法使用,因此我们将需要针对每种情况使用不同的 Node 类,比如说DefaultNodeSpecialNode extends DefaultNode

现在我想DefaultNode包含节点需要工作的所有常规内容,例如直接邻居列表。所以我在DefaultNode

List<DefaultNode> neighbours = new ArrayList<DefaultNode>();

我现在的问题是,我显然在SpecialNode类中也需要这个列表,但它应该包含并返回 SpecialNodes。当然,我可以覆盖列表addNeighbour()以及getNeighbours()继承自的每个类中的方法DefaultNode,但这似乎是多余的,而不是 OOP 的工作方式。我认为这将是使用模板的完美案例(就像在 C++ 中一样),但是 afaik 在 Java 中没有这样的构造,留给我们泛型。

到目前为止,我想出的解决方案如下:

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)。

于 2013-01-04T11:38:28.903 回答