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.