实例化抽象类变通方法

时间:2013-04-12 19:54:45

标签: java graph abstract

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

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()方法。

有解决方法吗?

1 个答案:

答案 0 :(得分:1)

只是不要将Edge类抽象化。如果您希望仅在子类中实现方法,请在Edge中生成抛出UnsupportedOperationException的存根实现。在实践中,这会导致很少的实际问题,因为实施中的这些错误很早就会被发现。

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