Was ist in C # die bevorzugte Methode, um einer Klasse (Deep) Copy-Funktionen hinzuzufügen? Sollte man den Kopierkonstruktor implementieren oder vielmehr von ICloneable ableiten und die Clone () -Methode implementieren?
Das Problem dabei ICloneableist, wie andere bereits erwähnt haben, dass nicht angegeben wird, ob es sich um eine tiefe oder flache Kopie handelt, was sie praktisch unbrauchbar macht und in der Praxis selten verwendet. Es kehrt auch zurück object, was ein Schmerz ist, da es viel Casting erfordert. (Und obwohl Sie in der Frage ausdrücklich Klassen erwähnt haben, erfordert die Implementierung ICloneableauf einem structBoxen.)
Ein Kopierkonstruktor leidet auch unter einem der Probleme mit ICloneable. Es ist nicht offensichtlich, ob ein Kopierkonstruktor eine tiefe oder flache Kopie erstellt.
Account clonedAccount = new Account(currentAccount); // Deep or shallow?
Am besten erstellen Sie eine DeepClone () -Methode. Auf diese Weise ist die Absicht völlig klar.
Dies wirft die Frage auf, ob es sich um eine statische oder eine Instanzmethode handeln soll.
Account clonedAccount = currentAccount.DeepClone(); // instance method
oder
Account clonedAccount = Account.DeepClone(currentAccount); // static method
Ich bevorzuge manchmal leicht die statische Version, nur weil das Klonen eher etwas ist, das mit einem Objekt gemacht wird, als etwas, das das Objekt macht. In beiden Fällen gibt es Probleme, die beim Klonen von Objekten, die Teil einer Vererbungshierarchie sind, behoben werden müssen, und wie diese Probleme behandelt werden, kann letztendlich das Design beeinflussen.
class CheckingAccount : Account
{
CheckAuthorizationScheme checkAuthorizationScheme;
public override Account DeepClone()
{
CheckingAccount clone = new CheckingAccount();
DeepCloneFields(clone);
return clone;
}
protected override void DeepCloneFields(Account clone)
{
base.DeepCloneFields(clone);
((CheckingAccount)clone).checkAuthorizationScheme = this.checkAuthorizationScheme.DeepClone();
}
}