2010-11-09 51 views
0

在下面的代碼中,我想使用靜態加載方法中的代碼來刷新對象......但是如何用新對象重置當前對象?複製字段是唯一的方法嗎?用新的對象重置它

class WIP 
{ 
    // <Snipped> Various other properties... 
    public Boolean Refresh() 
    { 
     // Need to change the current object with the updated object 
     this = WIP.Load(this.ObjectID); // Says this is readonly... 
     return true; 
    } 

    public static WIP Load(long ObjectID) 
    { 
     // This static method fetches the data from DB and returns the object. 
    } 
} 

編輯:我剛剛張貼的問題後,這個想法......有沒有在這個任何陷阱?

class WIP 
{ 
    // <Snipped> Various other properties... 
    public Boolean Refresh() 
    { 
     // This method fetches the data from DB and updates the object. 
    } 

    public static WIP Load(long ObjectID) 
    { 
     WIP newObject = new WIP(); 
     newObject.ObjectID = ObjectID; 
     newObject.Refresh(); 
     return newObject; 
    } 
} 
+0

不,你不能那樣做。 – leppie 2010-11-09 08:01:17

+0

這會令人困惑,因爲對象的「加載」會將負載委託給對象的刷新方法。 – 2010-11-09 08:13:51

回答

1

不,你不能。最接近你可以來的基本上是複製每個成員 - 當然,如果某些是隻讀的,這是不會起作用的。

要麼讓你的對象不可變 - 在這種情況下,它不應該不應該在已經有對象引用的代碼腳下改變 - 或者你不是,在這種情況下,你只是需要使其完全變爲(如果涉及多個線程,理想情況下以某種原子方式)。

+0

你能否看看更新後的問題 – 2010-11-09 08:12:01

+0

@The King:目前尚不清楚你是什麼因爲Refresh方法現在完全是空的,所以更新後的代碼正試圖做。 – 2010-11-09 08:22:18

-1

在靜態方法不能使用this關鍵字。因此你也不能使用實例變量。

+0

代碼不會嘗試在靜態方法中使用「this」。 – 2010-11-09 08:06:16

0

你不能。

只要認爲每個其他對象持有對您嘗試「刷新」的對象的引用應該更新。你只是增加一個間接級別或改變你的軟件設計。

+0

你能否看看更新後的問題 – 2010-11-09 08:12:52

+0

由於缺少Refresh()方法實現,我不能進一步評論... – Simone 2010-11-09 08:50:44

0

Static方法表明它是一種「Factory-Style」實現。因此應該用來創建或獲取對象的新實例。

另一方面的Refresh方法會自然地用於刷新當前對象的屬性並保持對象引用完好無損。

用法:

// Initialize the object 
WIP myWip = WIP.Load(1); 
Console.WriteLine(myWip.ObjectId); 
// Refresh the object from underlying data store 
myWip.Refresh(); 


// <Snipped> Various other properties... 
public Boolean Refresh() 
{ 
    //Read the values from data store and refresh the properties...   
    return true; 
} 

public static WIP Load(long ObjectID) 
{ 
    // This static method fetches the data from DB and returns the object. 
} 

對於對象的生命週期管理我會用一些工廠。您可以查看工廠模式 - >http://en.wikipedia.org/wiki/Factory_method_pattern

+0

謝謝......我在看到您的答案之前更新了問題...你想和我說什麼嗎? – 2010-11-09 08:13:44

1

聽起來像是你需要「WIP工廠」:

class WIP 
{ 
    private static Dictionary<long, WIP> instances = new Dictionary<long, WIP>(); 
    private WIP() 
    { 
     ... 
    } 


    // <Snipped> Various other properties... 
    public Boolean Refresh() 
    { 
     // This method fetches the data from DB and updates the object. 
    } 

    public static WIP Load(long ObjectID) 
    { 
     WIP wip = null; 
     if (instances.ContainsKey(ObjectID)) 
     { 
      wip = instances[ObjectID]; 
     } 
     else 
     { 
      wip = new WIP(); 
      wip.ObjectID = ObjectID; 
      instances.Add(ObjectID, wip); 
     } 
     wip.Refresh(); 

     return wip; 
    } 
} 

這將導致以獲得WIP的實例的唯一方法是通過靜態「負載」的方法,你將使用相同的實例每個ObjectID與當前的代碼不同,它允許任何人爲相同的ID創建新的實例。

這種方式調用刷新將更新所有的實例,無論他們在哪裏。