2013-02-14 71 views
0

我試圖創建一個不可變的數據結構,它是任務列表。 我希望每個任務都有對列表的引用,並且列表將返回所有任務並具有當前任務屬性。不可變數據結構中的循環引用

問題是如何讓循環引用從任務到列表和從列表到任務,仍然具有不變的數據結構?

如果我先創建的任務,我不能有參考列表,因爲它還不存在,如果我走另一條路 - 創建列表首先,我將不得不改變它,以便將任務添加到它。

謝謝, 伊多。

+0

什麼語言?還是理論上? – Dukeling 2013-02-14 14:28:52

+0

如果您將構建列表和任務所需的所有參數傳遞給列表構造函數,它將在技術上可行(例如,通過將「this」傳遞給任務的構造函數)。 – 2013-02-14 14:31:52

+0

相關:http://blogs.msdn.com/b/ericlippert/archive/2007/11/13/immutability-in-c-part-one-kinds-of-immutability.aspx – delnan 2013-02-14 16:47:38

回答

2

我敢肯定你可以創建列表,並在構造函數中構造列表項,同時將列表作爲參數傳遞給它們。

僞代碼:

List constructor: 
    List() 
    { 
    for each item to add 
     add(new Item(this)); 
    } 

Item constructor: 
    Item(List list) 
    { 
    this.list = list; 
    } 

然而,這類型的休息模塊化的,由於該表的構造必須處理所有的邏輯來創建項目。

+0

我會試試看看它是否適用於C#。謝謝 – 2013-02-14 17:44:05

+0

這是在C#中工作。看到這裏http://pastebin.com/E8qcLRMP。唯一的問題是在ctor內部使用這個,但我只保存它並且不做任何事情。 – 2013-02-14 18:01:00

0

您不能同時創建列表和任務,因此您必須先創建一個。在某些時候,你從一個空的列表開始(例如在列表的構造函數或其他地方)。

給定空列表,您可以創建任務:例如在列表的構造函數中,或列表中的方法。您可以將對列表的引用傳遞給任務的構造函數。然後將任務添加到列表中,這樣列表就會有一個對任務的引用。

+0

這意味着我改變列表,所以它不是我正在尋找的解決方案 – 2013-02-14 17:43:24