HAVIT Knowledge Base

Vývoj webových aplikací, .NET, SQL, návrh
Welcome to HAVIT Knowledge Base Sign in | Join | Help
-
Home Články Forums Obrázky Soubory

Patterns & practices

Architecture patterns, design patterns, best practices, implementace interfaces, ...

ICloneable

ICloneable je rozhraní (interface) .NET Frameworku pro podporu klonování objektů, tedy pro vytváření nových instancí třídy se stejnými hodnotami, jako má instance existující.

Základním kamenem pro implementaci ICloneable je protected metoda Object.MemberwiseClone(), která vytvoří shallow-copy (mělkou kopii) objektu. Mělkost kopie spočívá v tom, že jsou zkopírovány pouze přímé hodnoty objektu, což u referenčních typů má za následek pouze vytvoření nových referencí na stejnou instanci.

Korektní implementace rozhraní ICloneable by měla vypadat asi takto:

class MyCloneableClass : System.ICloneable
{
   // Explicitní implementace metody rozhraní.
   // Potřebná pro klienty ICloneable, ale neviditelná 
   // běžné klienty MyCloneableClass
   object ICloneable.Clone()
   {
      // prostě vrátíme hodnotu naší implementace
      return this.Clone(); 
   }
   // Silně-typovaná metoda Clone
   public virtual MyCloneableClass Clone()
   {
      // běžná memberwise-kopie vlastních hodnot
      MyCloneableClass x = this.MemberwiseClone() as MyCloneableClass;
      // následuje deep-copy všeho, co je potřeba
      x.somethingDeep = this.somethingDeep.Clone();
      return x;
   }
}

Pokud ICloneable korektně implementujeme u všech našich tříd, bude vše velmi primitivní. Vlastní klonování bude probíhat v kaskádě, resp. procházením stromu do hloubky. Problém samozřejmě nastane, když budeme mít člen referenčního typu, který neimplementuje ICloneable.

Published 28. dubna 2006 1:33 by Robert Haken
Filed under:

Comment Notification

If you would like to receive an email when updates are made to this post, please register here

Subscribe to this post's comments using RSS

Comments

No Comments

What do you think?

(required) 
(optional)
(required) 
Enter the code you see below

Submit