This post originated from an RSS feed registered with .NET Buzz
by -.
Original Post: ICloneable: Etwas unsauber, nicht?
Feed Title: Norbert Eder - Living .NET
Feed URL: http://feeds.feedburner.com/NorbertEder-Livingnet
Feed Description: Copyright (c)2005, 2006 by Norbert Eder
Das Interface ICloneable wird f��r gew��hnlich implementiert, wenn das entsprechende Objekt geklont werden soll. Nun ergibt sich aus meiner Sicht hier ein kleines Problem:
ICloneable stellt eine Methode Clone zur Verf��gung. Diese wird f��r die Klon-Implementierung verwendet. Nun gibt es aber zwei M��glichkeiten zu klonen:
Deep Copy: Alle Objekte werden dubliziert.
Shallow Copy: Nur Objekte oberster Ebene werden vervielf��ltigt. Alle anderen Objekte stellen Verweise auf die tats��chlichen Objekte dar.
Das eigentliche Problem dieser Schnittstelle besteht nun in folgender MSDN-Aussage:
Clone can be implemented either as a deep copy or a shallow copy.
Dadurch ist nicht klar definiert, wie die Clone-Methode nun zu implementieren ist. Bei der Entwicklung eines Frameworks wirft dies das Problem auf, dass der Verwender dieses Frameworks (abgesehen von der m��glicherweise recht d��rftigen Dokumentation) nicht wei��, ob sein dubliziertes Objekt nun eine vollst��ndige Kopie darstellt, oder eben nicht.
Aus meiner Sicht empfehle ich daher, ICloneable nicht zu verwenden und stattdessen eine eigene Implementierung vorzunehmen, die hier eindeutiger ist. Anbieten w��rde sich die Erstellung zweier Interfaces nach folgendem Muster:
public interface IShallowCloneable<T>
{
T ShallowClone();
}
Durch die Implementierung des Interfaces IShallowCloneable geht nun eindeutig hervor, dass dabei ein Shallow Copy durchzuf��hren ist.
public interface IDeepCloneable<T>
{
T DeepClone();
}
Ebenso verh��lt es sich beim Interface IDeepCloneable
Zu guter Letzt noch ein Hinweis auf Object.MemberwiseClone(): MemberwiseClone erstellt eine flache Kopie (Shallow Copy) des aktuellen Objektes und k��nnte f��r diesen Zweck benutzt werden. Auch hier ein kurzer Auszug aus der MSDN:
MemberwiseClone kann nicht ��berschrieben und nur ��ber diese oder eine abgeleite Klasse aufgerufen werden. Verwenden Sie eine Klasse, die die ICloneable-Schnittstelle implementiert, wenn eine tiefe oder flache Kopie eines Objekts ��ffentlich f��r die Benutzer bereitgestellt werden muss.
Bei diesem Thema scheint man sich also selbst bei Microsoft nicht 100%ig einig zu sein. Daher also mein Rat f��r eigene Frameworks: F��r den Zweck des Kopierens sollten eigene Interfaces bereitgestellt werden. Dadurch k��nnen jegliche Zweifel aus dem Weg ger��umt werden. In Kombination mit einer eindeutigen Dokumentation sieht sich der Konsument des Frameworks dadurch mit keinerlei Fehl-Information konfrontiert.