2013-04-12 3 views
0

Так, так как я буду использовать различные типы графиков я решил общее поведение в абстрактных классах:Instantiate абстрактный класс обходной путь

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 класс является абстрактным. Проблема в том, что Edges тоже абстрактны, но где equals() и hashCode() были переопределены, так что ребро может быть идентифицировано его узлами. Кажется ненужным сделать защитный список края или что-то еще и реализовать тот же метод getEdge() в каждом подклассе.

Есть ли решение для этого?

+1

Я не понимаю, зачем вам «внедрять один и тот же метод getEdge() в каждом подклассе« при любых обстоятельствах? –

+0

Сложная формулировка. –

+0

Потому что я хочу получить ребро из списка ребер и методов вызова. Например. Мне нужно было бы вызвать getWeightedEdge (MaxFlowGraphNode n1, MaxFlowGraphNode n2), написанный в MaxFlowGraph, который расширяет график, чтобы изменить вес на краю. – user2275809

ответ

1

Просто не делайте абстракции класса Edge. Если у вас есть методы, которые вы хотите реализовать только в подклассах, сделайте реализацию stub в Edge, которые выкидывают UnsupportedOperationException. На практике это вызывает очень мало фактических проблем, потому что такие ошибки в реализации пойманы очень рано.

Другой выбор - не полагаться на List#indexOf, но создать свой собственный алгоритм, который найдет ребро, основанное не на equals, а на явное сравнение пары узлов. В основном это сводится к реализации семантики equals по внешнему методу (для удобства это может быть статический метод в Edge).

+0

Так, похоже, это работает, изменив значение на public Edge getEdge (Edge e) { return edge.get (edge.indexOf (e)); } и вызов метода с подклассифицированными ребрами, например. Edge maxFlowEdge = maxFlowGraph.getEdge (новый maxFlowEdge (n1, n2)) – user2275809

+0

Если это не приводит к дублированию кода для вас, почему бы и нет :) –

Смежные вопросы