The Artima Developer Community
Sponsored Link

.NET Buzz Forum
ICloneable: Etwas unsauber, nicht?

0 replies on 1 page.

Welcome Guest
  Sign In

Go back to the topic listing  Back to Topic List Click to reply to this topic  Reply to this Topic Click to search messages in this forum  Search Forum Click for a threaded view of the topic  Threaded View   
Previous Topic   Next Topic
Flat View: This topic has 0 replies on 1 page
-

Posts: 1524
Nickname: nitronic
Registered: Jul, 2006

Norbert Eder works as a software architect.
ICloneable: Etwas unsauber, nicht? Posted: Jan 3, 2007 12:47 AM
Reply to this message Reply

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
Latest .NET Buzz Posts
Latest .NET Buzz Posts by -
Latest Posts From Norbert Eder - Living .NET

Advertisement
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.

Read: ICloneable: Etwas unsauber, nicht?

Topic: Paper zur Common Language Infrastructure (CLI) Previous Topic   Next Topic Topic: A little piece of Ruby in C#

Sponsored Links



Google
  Web Artima.com   

Copyright © 1996-2019 Artima, Inc. All Rights Reserved. - Privacy Policy - Terms of Use