2010-03-22 3 views
2

Je réutilise un objet créé juste pour changer une date et la valeur ordinale, mais à la fin j'obtiens 6 objets exactement comme le dernier.Réutilisation de l'objet ne fonctionne pas correctement

autrement dit, je suis d'ajouter l'objet en tant que référence et je devrais ajouter au Valeur

Que dois-je faire pour hériter mon objet d'avoir la méthode 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 
} 

Merci

+0

En passant vos commentaires dans votre code ne dit pas grand-chose. Que la méthode "Ajouter" ajoute un objet n'est pas quelque chose que vous devez commenter. Peut-être commenter pourquoi vous l'avez ajouté etc –

Répondre

3

Vous pouvez implémenter ICloneable puis appeler clone pour obtenir une copie superficielle de votre objet!

Vous pouvez mettre en œuvre comme si vous voulez (il y a probablement de meilleurs moyens là-bas):

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

C'est le plus facile :) Ty! – balexandre

2

Vous ne finissent pas avec 6 objets. Vous vous retrouvez avec 6 références qui se réfèrent tous au même objet .

Vous pourrait mettre en œuvreICloneable et appeler Object.MemberwiseClone - mais je ne suis pas sûr que je le ferais. Au lieu de cela, je serais tenté d'essayer de rendre immuable RecurringPayment, et d'ajouter une méthode WithNextPaymentDate(DateTime nextDate) ou quelque chose de similaire, qui crée un nouvel objet avec les valeurs données. Votre code serait alors quelque chose comme ceci:

// 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

Vous vous demandez pourquoi vous ne choisiriez pas l'approche Clone(), ne vous inquiéteriez pas ou vous donneriez un nouvel aperçu? Ty. – balexandre

+0

@balexandre: Je trouve les types immuables plus faciles à comprendre et à utiliser. ICloneable est généralement considéré comme une mauvaise interface: vous devez lancer le résultat en retournant simplement 'object', et rien n'indique s'il doit effectuer un clone profond ou superficiel. –

+0

Je vais suivre votre recommandation :) – balexandre

Questions connexes