我對Java相當陌生,我需要一些幫助來找出一個好的類層次結構和總體設計(我正在研究CS)。Java類設計 - 圖
該任務與圖論有關,因此我們被要求爲2種類型的圖形,簡單圖形和多圖形(允許有平行邊緣)以及相應的實現創建接口。
我想出了以下接口層次:
* Element - Vertex - Edge + MultiEdge * Graph - MultiGraph
及其相應的實施方案。 現在我真的不想在這裏討論我的實際實現,我只是給我一些例子,因爲(至少我是這麼認爲的),我設計整體思維的方式遇到了麻煩。
整個事情工作得很好,直到我需要擴展我的圖形具有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); }
正如你所看到的,我圖形邊緣<邊緣>存儲在一個列表,我GraphImpl,爲此和我有很多的名單都在我的實現。另外,你可以看到我從addEdge返回了一個新的GraphImpl,因爲GraphImpl應該是不可變的。
有了這個實現多圖時,我遇到了很多麻煩,因爲在這裏,我需要交換名單<邊緣>的列表<MultiEdge>。但是當我重新定義了MultiGraph中的「邊緣」變量時,我認爲GraphImpl中的方法仍然訪問我在GraphImpl中定義的列表,因此如果我調用MultiGraph,則不會添加邊緣,直到爲MultiGraph完全重寫爲止。但後來我發現我不得不重寫它,因爲GraphImpl中的addEdge(自然地)返回一個GraphImpl,但在MultiGraphImpl中,我需要創建一個MultiGraphImpl。
我想明白的是,你將如何設計和實現這樣的事情。我擁有的是一堆相互延伸的接口,以及相同的實現層次,也相互延伸。
Graph的功能只是MultiGraph的一個子集,因此GraphImpl中所做的一切大多數對MultiGraphImpl也是有效的。現在,我需要將大量代碼從GraphImpl複製到MultiGraphImpl,只是爲了克服類型問題(我至少在某種程度上可以理解,但我不知道如何繞過它們)。
我希望你現在不要太困惑,因爲我確實是這樣;)如果我在任何部分都不清楚,我會很樂意澄清,只是指出我缺少什麼。
不完全是,但它無論如何幫助,所以謝謝:) – fresskoma 2010-11-02 21:39:43