2010-11-28 19 views
3

クラスがICloneableを実装した場合、それはどういう意味ですか?ICloneable question

+3

残念ながら、それほど多くはありません。 http://pro-thoughts.blogspot.com/2009/02/write-deep-clone-forget-about.html –

+0

ここでも少し説明があります.http://www.devx.com/vb2themax/ Tip/18707 –

+0

これは 'Clone'の法的実装です:' class Foo:ICloneable {public int Value {get;プライベートセット; } public Foo(int value){this.Value = value; }パブリックオブジェクトClone(){return "Hello、World!"; }} 'インタフェースは動作については何も言わず、指定されたシグネチャと戻り値の型を持つメソッドの存在についてのみ伝えます。 _intent_は、メソッドがクローン(浅いまたは深い)またはオブジェクトを返すが、それは_promise_ではないということです。 – jason

答えて

6

これはIClonable.Cloneメソッドです。ドキュメンテーションによれば、このメソッドはオブジェクトを複製するためのものです。ドキュメンテーションは、クローンが深いか浅いかのいずれかであることを具体的に示しています。また、結果のタイプは、複製されるオブジェクトと同じ型のである必要がありますが、実際には型システムに保証されていないことにも注意してください。

これをまとめると、それほど厳しい約束はありませんが、目的は独立したクローンを作成することです。

0

基本的には、それだけでクラスがクローン化することができます

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

任意のインターフェイスを実装する場合、あなたはそのインタフェースのメソッドを定義する必要があります。この場合、クラスでCloneメソッドを定義する必要があります。マイクロソフトから

例:

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

いいえ、 'Clone'という名前のメソッドがあり、パラメータを受け付けず、' object'のインスタンスを返すだけです。それは行動については何も言わない。 – jason

+0

クラスがインタフェースを実装する場合、そのインタフェースでメソッドを定義するのはクラスの責任です。 –

0

それはちょうどクラスはそれ以上、オブジェクトを返すメソッドではないCloneを実装しなければならないことを意味します。したがって、ICloneableを受け入れ、そのオブジェクトを複製できるメソッドを持つことができます。

+0

クラスが 'Clone'という名前のメソッドを持っているからといって、呼び出されたときにそのメソッドがそのクラスのインスタンスを複製するわけではありません。インタフェースは動作に関する約束ではなく、与えられたシグネチャと戻り値の型を持つメソッドがクラスに存在することについての約束に過ぎません。 – jason

+0

@ジェイソン私はそれが非常に明確であったと思う、私の最初の行 –

+0

2番目の文の最後の5つの単語は、 "あなたはそのオブジェクトを複製することができます。私の最初の文章に注目してください。 "クラスには' Clone'という名前のメソッドがあるからといって、呼び出されたときにそのメソッドがそのクラスのインスタンスを複製するわけではありません。私たちのうちの1人だけが正しいことができます。 'ICloneable'はあなたがそのオブジェクトをクローンすることができるか、そうでないことを意味します。私はオブジェクト上で 'Clone'という名前のメソッドを呼び出すことができますが、クローンを生成する保証はありません。 cf. OPへの私のコメント。 – jason

0

ICloneableは単独では意味がありませんが、他の制約(ICloneableを実装するFooでなければならないパラメータなど)と併用すると便利です。したがって、Foo、CloneableFoo、AdvancedFoo、およびCloneableAdvancedFooを持つことができ、クローン化をサポートするFooの派生物を区別しないものと区別できるようになりますが、クローン可能なFooがCloneable Fooの派生物を受け入れることを期待するルーチンも許可します。

残念ながら、IClonableとFooの制約で渡された関数パラメータは型キャストなしでIClonableおよびFooとして使用できますが、そのような条件を満たすフィールドを作成する方法はなく、フィールドを型キャストする方法もありません。これを解決するには、Tを返す "Clone"メソッドとTも返す "Self"メソッドを含むICloneable(Of T As ICloneable(Of T))を作成することがあります(したがって、 ICloneable Of Foo "は" Self "メソッドでFooとしてアクセスできます)。これをすべて動作させるには少し注意が必要ですが、パターンはすばらしくすべきです。