2010-03-22 95 views
2

我重新使用一個創建的對象只是爲了更改日期和序號值,但最後我得到了6個對象完全一樣。重用對象無法正常工作

換句話說,我加入的對象爲參考,我應該添加爲

我要繼承我的對象有Copy()方法?

RecurringPayment rp, copy; 

rp = new RecurringPayment 
{ 
    ... 
} 
payments.Add(rp); // add first object 

copy = rp; // Copy the original element 
for (int i = 1; i <= 5; i++) 
{ 
    copy.NextPaymentDate = copy.NextPaymentDate.AddDays(copy.RecurringTime * 7); 
    copy.OrderOrdinal = copy.OrderOrdinal + 1; 

    payments.Add(copy); // add 5 more with X weeks ahead 
} 

謝謝

+0

順便說一句,你的代碼中的評論並不多說。方法「添加」添加一個對象不是你需要評論的東西。也許評論你爲什麼加入它等 – 2010-03-22 22:24:18

回答

3

您可以實現ICloneable,然後調用clone讓你的對象的淺拷貝!

您可以實現這樣的,如果你想(有可能是更好的方法在那裏):

public object Clone() 
{ 
    return MemberwiseClone(); 
} 
+0

這是最簡單的一個:) Ty! – balexandre 2010-03-22 22:29:42

2

你並不會因爲6個對象結束。您最後得到6 參考文獻所有這些參考相同的單個對象

可能實施ICloneable,並呼籲Object.MemberwiseClone - 但我不知道我會。相反,我很想嘗試使RecurringPayment不可變,並添加一個方法WithNextPaymentDate(DateTime nextDate)或類似的東西,它會創建一個具有給定值的新對象。你的代碼會是這樣的:

// Can't use object initializers on immutable types of course - all the 
// values would have to be specified in the constructor call 
RecurringPayment payment = new RecurringPayment(...); 
payments.Add(payment); 

for (int i = 1; i <= 5; i++) 
{ 
    // This would automatically increment the OrderOrdinal in the newly 
    // created object 
    payment = payment.WithNextPaymentDate(payment.RecurringTime * 7); 
    payments.Add(payment); 
} 
+0

想知道爲什麼你不會選擇Clone()方法,任何技術擔心還是隻是爲了提供新的見解? TY。 – balexandre 2010-03-22 22:24:49

+0

@balexandre:我發現更易於理解和使用的不可變類型。 'ICloneable'通常被認爲是一個糟糕的接口:你只能返回結果,因爲它只返回'object',而且沒有跡象表明它是否應該執行深度或淺層克隆。 – 2010-03-23 07:12:48

+0

我會按照你的建議:) – balexandre 2010-03-23 14:39:56