ICloneable
から継承してClone()
メソッドを実装する必要がある理由を説明できますか?
ディープコピーを実行したい場合、メソッドを実装することはできませんか? MyClone()
としましょうか?
ICloneable
から継承する必要があるのはなぜですか?利点は何ですか?コードを「読みやすく」するだけの問題ですか?
してはいけません。 ICloneable
メソッドが「ディープ」クローンを実行するか「シャロー」クローンを実行するかはインターフェイスから明確に示されていないため、MicrosoftはClone
の実装を推奨していません。
Brad Abramsからのこのブログ投稿 詳細については、2003年(!)を参照してください。
ICloneable
インターフェイス 単独で これはあまり有用ではありません。つまり、オブジェクトについて他に何も知らなくても複製可能であることを知ることが有用な状況は実際には多くないということです。これは、たとえばIEnumerable
またはIDisposable
;列挙方法以外に何も知らずにIEnumerable
を受け入れると便利な場合が多くあります。
一方、ICloneable
は、他の制約とともに一般的な制約として適用される場合に役立ちます。たとえば、基本クラスはいくつかの派生物を有効にサポートする場合があり、その一部は便利にクローン化でき、一部はそうではありません。基本型自体がパブリッククローニングインターフェイスを公開している場合、クローンを作成できない派生型は、リスコフの置換原則に違反します。この問題を回避する方法は、Protectedメソッドを使用して基本型でクローン作成をサポートし、派生型がパブリッククローニングインターフェイスを適切に実装できるようにすることです。
それが達成されると、WonderfulBase
タイプのオブジェクトを受け入れ、それを複製できるようにする必要があるメソッドをコーディングして、複製をサポートするWonderfulBaseオブジェクトを受け入れるようにコーディングできます( base-typeおよびICloneable
制約)。 ICloneable
インターフェース自体はディープクローンまたはシャロークローンを示すものではありませんが、WonderfulBase
のドキュメントは、クローン可能なWonderfulBase
をディープクローンまたはシャロークローンすべきかどうかを示します。基本的に、ICloneable
インターフェースは、ICloneableWonderfulBase
を定義しても達成できないことは何も達成しませんが、クローン可能な基本クラスごとに異なる名前を定義する必要がなくなることを除きます。
ICloneable
は、物議をかもしているBCLのアーティファクトの1つです。私見でそれを実装する本当の理由はありません。とはいえ、クローンメソッドを作成する場合は、ICloneable
を実装し、Clone
の独自の強力な型付きバージョンを提供します。
ICloneable
の問題は、Clone
が浅いコピーであるか深いコピーであるかがまったく異なることを示していないことです。 ICloneable<T>
が存在しないという事実は、ICloneableについてのMicrosoftの考えを示している可能性があります。
マットは正しいので、使用しないでください。独自のCopy()
メソッド(または同様の名前)を作成し、メソッドがオブジェクトの深いコピーを作成するか浅いコピーを作成するかにかかわらず、パブリックAPIで完全に明確にします。