因为我将使用各种类型的图表,所以我决定将常见行为放在抽象类中:
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()
方法。
有解决方法吗?
答案 0 :(得分:1)
只是不要将Edge
类抽象化。如果您希望仅在子类中实现方法,请在Edge
中生成抛出UnsupportedOperationException
的存根实现。在实践中,这会导致很少的实际问题,因为实施中的这些错误很早就会被发现。
另一种选择是不依赖于List#indexOf
,而是构建自己的自定义算法,该算法不是基于equals
而是基于节点对的显式比较来定位边缘。基本上它相当于通过外部方法实现equals
语义(为方便起见,它可能是Edge
中的静态方法)。