java实例化抽象类解决方案
因此,由于我将使用各种类型的图,我决定将常见行为放在抽象类中:
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)));
}
}
即使Node
类是抽象的,getNode()
也不会抱怨。问题是边也是抽象的,但是equals()
和hashCode()
已被覆盖,因此可以通过其节点识别边。似乎没有必要保护边缘列表或其他东西,并在每个子类中实现相同的getEdge()
方法
有解决办法吗
# 1 楼答案
只是不要将
Edge
类抽象化。如果您有只想在子类中实现的方法,请在Edge
中进行存根实现,该存根实现抛出UnsupportedOperationException
。在实践中,这几乎不会导致实际问题,因为实现中的此类错误很早就被发现了另一种选择是不依赖
List#indexOf
,而是构建自己的自定义算法,该算法不基于equals
而是基于节点对的显式比较来定位边缘。基本上,它相当于通过外部方法实现equals
语义(为了方便起见,它可以是Edge
中的静态方法)