0

因此,由于我将使用各种类型的图表,我决定将常见行为放在抽象类中:

public abstract class Graph {

private List<Node> nodes;
private List<Edge> edges;

public void addNode(Node n) {
    nodes.add(n);
}

public void addEdge(Edge e) {
    edges.add(e);
}

public Node getNode(Node n) {
    return nodes.get(nodes.indexOf(n));
}

public Edge getEdge(Node left, Node right) {
    return edges.get(edges.indexOf(new Edge(left, right)));
   }
}

getNode()即使Node类是抽象的,也不会抱怨(还)。问题是边也是抽象的,但是在哪里equals()hashCode()已被覆盖,以便可以通过其节点识别边。似乎没有必要使边缘列表受保护或其他东西并getEdge()在每个子类中实现相同的方法。

有解决方案吗?

4

1 回答 1

1

只是不要使Edge类抽象。如果您有只希望在子类中实现的方法,请在Edge该 throw中进行存根实现UnsupportedOperationException。在实践中,这会导致非常少的实际问题,因为这些实施中的错误很早就被发现了。

另一种选择是不依赖List#indexOf而是构建自己的自定义算法,该算法不是基于equals而是基于节点对的显式比较来定位边缘。基本上,它相当于equals通过外部方法实现语义(Edge为方便起见,它可以是静态方法)。

于 2013-04-12T20:06:06.170 回答