我对Java相当陌生,我需要一些帮助来确定一个好的类层次结构和一个我们已经给出的任务的总体设计(我正在研究CS)。
这项任务与图论有关,因此我们被要求为两种类型的图、简单图和多个图(允许有平行边)创建接口,以及相应的实现。
我提出了以下接口层次结构:
* Element
- Vertex
- Edge
+ MultiEdge
* Graph
- MultiGraph
以及相应的实现。
现在我真的不想在这里讨论我的实际实现,我只是给出一些例子,这些例子是我设计整个思想的方式(至少我这么认为)给我带来的麻烦。
在我需要扩展我的图以具有多图功能之前,整个过程都很好地工作。以下是来自graphimpl的代码片段:
protected final List edges;
public Graph addEdge(Edge e) {
List newEdges = new ArrayList<Edge>();
newEdges.addAll(edges);
newEdges.add(e);
return new GraphImpl(vertices, newEdges);
}
如您所见,我将图形边缘存储在我的图形MPL中的一个列表<edge>中,因此,我的实现中有许多这样的列表。另外,您可以看到我从addedge返回了一个新的graphimpl,因为graphimpl应该是不可变的。
有了这个,我在实现多重图时遇到了很多麻烦,因为在这里,我需要将列表<edge>替换为列表<multipedge>。但是当我重新定义多重图中的“边”变量时,我认为graphimpl中的方法仍然访问我在graphimpl中定义的列表,这样,如果我调用多重图,边就不会被添加,直到完全为多重图重写它。但后来我注意到无论如何我都必须重写它,因为graphicmpl中的addedge返回(自然)graphicmpl,但在multicophicmpl中,我需要创建multicophicmpl。
我试图理解的是,你将如何设计和实现这样一个东西。我所拥有的是一组相互扩展的接口,以及相同的实现层次结构,它们也相互扩展。
图的功能只是多重图的一个子集,所以在graphimpl中所做的所有工作对多重图也是有效的。现在,我需要将大量的代码从graphimpl复制到multipgraphmpl,只是为了克服类型问题(至少我能理解,但我不知道如何绕过这些问题)。
我希望你现在不要太困惑,因为我肯定是;)如果我在任何方面都不清楚,我很乐意澄清,就把我指向缺失的地方。