2014-01-18 12 views
0

目前在這一回購:https://github.com/quinnliu/WalnutiQ如何使面向對象的Java項目完全通用

我用下面的代碼來創建一個局部腦模型:

Neocortex unconnectedNeocortex = new Neocortex(new Region("V1", 4, 4, 
      4, 50, 3), new RegionToRegionRectangleConnect()); 

    LGN unconnectedLGN = new LGN(
      new Region("LGN", 8, 8, 1, 50, 3)); 

    Retine unconnectedRetina = new Retine(65, 65); 

    NervousSystem nervousSystem = new NervousSystem(unconnectedNeocortex, 
      unconnectedLGN, unconnectedRetina); 

    // connect Retine to LGN 
    Retine retine = nervousSystem.getPNS().getSNS().getRetine(); 
    LGN LGN = nervousSystem.getCNS().getBrain() 
      .getThalamus().getLGN(); 
    SensorCellsToRegionConnect sensorCellsToRegionConnect = new SensorCellsToRegionRectangleConnect(); 
    sensorCellsToRegionConnect.connect(retine.getVisionCells(), 
      LGN.getRegion(), 0, 0); 

    // connect LGN to V1 Region of Neocortex 
    Neocortex neocortex = nervousSystem.getCNS().getBrain().getCerebrum() 
      .getCerebralCortex().getNeocortex(); 
    RegionToRegionConnect regionToRegionConnect = new RegionToRegionRectangleConnect(); 
    regionToRegionConnect.connect(LGN.getRegion(), 
      neocortex.getCurrentRegion(), 0, 0); 

您可能已經注意到下面的代碼我上述使用具有不良代碼味道:

Retine retine = nervousSystem.getPNS().getSNS().getRetine(); 
    LGN LGN = nervousSystem.getCNS().getBrain().getThalamus().getLGN(); 

我想通過使弄成這樣解決這個問題:

Retine retine = nervousSystem.get<Retine>(); 
LGN LGN = nervousSystem.get<LGN>(); 

我被告知這是可能的,但我目前不知道如何做到這一點。有人可以解釋如何讓這個工作的步驟?謝謝!

+2

你想要什麼是不可能的。 「NervousSystem'''接口應該暴露'getRetine()'。 –

+0

[Demeter法](http://en.wikipedia.org/wiki/Law_of_Demeter) - 簡單的'getRetina'方法在神經系統上一次只傳遞一個請求就是一個解決方案。不必知道神經系統內的視網膜是更好的。 – zapl

+0

你試圖做的事情與真正的泛型沒有任何關係,它並沒有太大的意義。你如何期待神經系統瞭解視網膜?好像你想要某種圖形遍歷機制。再次,與泛型無關。 – jtahlborn

回答

1

這聽起來像你想要某種自動圖形遍歷系統(這與泛型沒有太大關係)。

喜歡的東西:

public abstract class BodyPart { 

    private List<? extends BodyPart> _linkedParts; 

    public <T extends BodyPart> T getPart(Class<? extends T> clazz) { 
    for(BodyPart part : _linkedParts) { 
     if(clazz.isInstance(part)) { 
     return clazz.cast(part); 
     } 
     T childPart = part.getPart(clazz); 
     if(childPart != null) { 
     return childPart; 
     } 
    } 
    return null; 
    } 
} 

然後,假設所有模型擴展BodyPart的(和他們的直接連接部分被添加到_linkedParts列表),你可以這樣做:

Retine retine = nervousSystem.getPart(Retine.class); 

顯然,這假設對所有鏈接都有獨特的結果,並且沒有循環鏈接。如果情況並非如此,則必須使邏輯更智能一些(檢測圓圈,返回多個結果等)。