2010-11-28 7 views
3

Wenn eine Klasse implementiert ICloneable, was bedeutet das?ICloneable Frage

+3

Leider nicht viel. http://pro-thoughts.blogspot.com/2009/02/write-deep-clone-forget-about.html –

+0

Sie können auch hier eine kleine Erklärung erhalten..http: //www.devx.com/vb2themax/ Tipp/18707 –

+0

Bitte beachten Sie, dass dies eine legale Implementierung von 'Clone' ist:' Klasse Foo: ICloneable {public int Value {get; privates Set; } public Foo (int Wert) {this.Value = Wert; } public object Clone() {return "Hallo, Welt!"; }} 'Interfaces sagen nichts über das Verhalten, sie sagen nur über die Existenz einer Methode mit einer bestimmten Signatur und einem Rückgabetyp. Das _intent_ ist, dass die Methode einen Klon (entweder seicht oder tief) oder das Objekt zurückgibt, aber es verspricht das nicht. – jason

Antwort

6

Das ist die IClonable.Clone Methode. Die Dokumentation besagt, dass die Methode Objekte klonen soll. Die Dokumentation weist ausdrücklich darauf hin, dass der Klon entweder tief oder flach sein kann. Es wird auch darauf hingewiesen, dass der resultierende Typ vom gleichen Typ wie das Objekt sein muss, das geklont wird, aber es gibt keine Garantie im Typsystem, dass es tatsächlich so ist.

Um es zusammenzufassen, es bietet nicht viel harte Versprechen, aber die Absicht ist, unabhängige Klone zu erstellen.

0

Grundsätzlich ist es erlaubt, nur die Klasse geklont werden:

http://msdn.microsoft.com/en-us/library/system.icloneable.aspx

Wenn jede Schnittstelle implementieren, werden Sie die Methoden in dieser Schnittstelle definieren erforderlich. In diesem Fall muss die Clone-Methode in Ihrer Klasse definiert werden.

Beispiel von Microsoft:

public object Clone() 
{ 
    return this.MemberwiseClone(); 
} 
+0

Nein, es besagt nur, dass es eine Methode namens 'Clone' gibt, die keine Parameter akzeptiert und eine Instanz von' object' zurückgibt; Es sagt nichts über das Verhalten aus. – jason

+0

Wenn eine Klasse eine Schnittstelle implementiert, muss die Klasse die Methoden in dieser Schnittstelle definieren. –

0

Es bedeutet nur, dass die Klasse eine Methode implementieren müssen Clone, die ein Objekt zurückgibt, nicht mehr als das. Sie können also eine Methode verwenden, die ein ICloneable akzeptiert, und dann können Sie dieses Objekt klonen.

+0

Nur weil eine Klasse eine Methode namens 'Clone' hat, bedeutet dies nicht, dass diese Methode Instanzen der Klasse klont, wenn sie aufgerufen wird. Eine Schnittstelle ist kein Versprechen über das Verhalten, sie ist nur ein Versprechen über die Existenz einer Methode mit einer bestimmten Signatur und einem Rückgabetyp für die Klasse. – jason

+0

@Jason Ich denke, das war sehr klar her, meine erste Zeile –

+0

Die letzten fünf Worte Ihres zweiten Satzes sind "dann können Sie dieses Objekt klonen." Beachten Sie meinen ersten Satz "Nur weil eine Klasse eine Methode namens' Clone 'hat, bedeutet das nicht, dass diese Methode Instanzen der Klasse klont, wenn sie aufgerufen wird. " Nur einer von uns kann Recht haben; entweder "ICloneable" bedeutet, dass Sie dieses Objekt klonen können oder nicht. Ich behaupte, dass es nur bedeutet, dass Sie eine Methode namens "Clone" für das Objekt aufrufen können, aber es gibt keine Garantie, dass es einen Klon erzeugt. vgl. mein Kommentar zum OP. – jason

0

ICloneable ist an sich nicht sinnvoll, kann aber in Verbindung mit anderen Einschränkungen nützlich sein (z. B. könnte ein Parameter ein Foo sein, der ICloneable implementiert). So könnte man einen Foo, einen CloneableFoo, einen AdvancedFoo und einen CloneableAdvancedFoo haben, der Foo-Derivate, die das Klonen unterstützen, von denen unterscheidet, die dies nicht erlauben, aber auch Routinen, die erwarten, dass ein klonbares Foo ein klonbares Derivat von Foo akzeptiert.

Leider, während ein Funktionsparameter mit IClonable und Foo Constraints als IClonable und als Foo ohne Typumwandlungen verwendet werden kann, gibt es keine Möglichkeit, ein Feld zu erstellen, das solche Kriterien erfüllt, noch gibt es eine Möglichkeit, ein Feld zu typisieren . Eine Abhilfe dafür könnte darin bestehen, eine ICloneable (Of T As ICloneable (Of T)) zu erstellen, die eine "Clone" -Methode enthält, die T zurückgibt, und eine "Self" -Methode, die ebenfalls T zurückgibt (also ein Feld mit einem " ICloneable Of Foo "könnte als Foo über die" Self "-Methode aufgerufen werden. Ein wenig Sorgfalt wäre nötig, damit alles funktioniert, aber das Muster sollte ganz nett sein.