我想在Java中制作一个节点图。图类将由不同的人和不同的算法使用,因此对于每种情况,我们将需要不同的Node类,例如DefaultNodeSpecialNode extends DefaultNode

现在,我希望DefaultNode包含节点需要工作的所有常规内容,例如直接邻居列表。因此,我在DefaultNode中实现了该列表:

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


我的问题是,显然我在SpecialNode类中也需要此列表,但该列表应包含并返回SpecialNodes。当然,我可以覆盖从addNeighbour()继承的每个类中的list和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> {}


现在,虽然这似乎可以按预期工作,但感觉有点奇怪……我很惊讶我找不到更简单的解决方案,因为这种情况似乎相对普遍。您将如何解决?我错过了更好/更简单的方法吗?还是上述可行的方法?

最佳答案

您的方法没有错。实际上,某些标准接口(例如Comparable)正是以这种方式定义的:

public class Fruit implements Comparable<Fruit> {
             ^^^^^                       ^^^^^

09-13 05:24