2010-03-22 3 views
2

저는 Date와 서수 값을 변경하기 위해 생성 된 오브젝트를 재사용하고 있습니다 만, 결국에는 6 개의 오브젝트를 마지막으로 얻습니다. 즉오브젝트 재사용이 제대로 작동하지 않습니다.

, 나는 참조으로 객체를 추가 그리고 난 내 Object가 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 
} 

당신은 당신의 개체의 단순 복사본을 얻기 위해 복제를 호출 한 후 ICloneable을 구현하고 있습니다 당신에게

+0

그런데 코드에있는 귀하의 의견은 많이 언급하지 않습니다. 메소드 "Add"가 객체를 추가한다는 것은 주석을 달 필요가 없다는 것입니다. 아마도 당신이 그것을 추가 한 이유 등을 –

답변

3

감사합니다! 당신이 (더 나은 방법은 거기에 아마가) 원하는 경우

당신은 다음과 같이 구현할 수 있습니다

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

가장 쉬운 방법입니다 :) Ty! – balexandre

2

당신은 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() 접근 방식을 선택하지 않겠습니까? 기술적 인 걱정이나 새로운 통찰력을 제공하려는 것일까요? 타이. – balexandre

+0

@balexandre : 변경 가능 유형을 쉽게 이해하고 작업 할 수 있습니다. 'ICloneable'은 일반적으로 나쁜 인터페이스로 간주됩니다 : 객체가'object'를 반환 할 때 결과를 캐스팅해야하며 깊거나 얕은 복제를 수행해야하는지 여부는 알 수 없습니다. –

+0

나는 당신의 권고를 따를 것입니다 :) – balexandre

관련 문제