有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    只是不要将Edge类抽象化。如果您有只想在子类中实现的方法,请在Edge中进行存根实现,该存根实现抛出UnsupportedOperationException。在实践中,这几乎不会导致实际问题,因为实现中的此类错误很早就被发现了

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