なぜ私はC#でICloneableを実装する必要がありますか?
-
22-08-2019 - |
質問
私はICloneable
から継承しClone()
メソッドを実装する必要がありますなぜあなたは私に説明できますか?
、私はちょうど私のメソッドを実装することはできませんか? MyClone()
を言ってみましょう?
私はICloneable
から継承する必要があるのはなぜ?利点は何ですか?それは作るだけの問題であるコード「読みやすく」?
解決
あなたはいけません。マイクロソフトは、あなたのICloneable
方法は「深い」または「浅い」クローンを実行するかどうかのインターフェースからの明確な指示がありませんので、Clone
を実施しないことをお勧めします。
ブラッドエイブラムスの背面からこのブログ記事を参照してください2003年(!)を参照してください。
他のヒント
ICloneable
インタフェースはそれ自体では、本当にそれは、オブジェクトがそれについて何も知らずに複製可能であることを知っておくと便利です多くの状況が存在していないと言うことである、非常に有用ではありません。これは、例えば非常に異なっ状況ですIEnumerable
またはIDisposable
。それはそれを列挙する方法以外に何も知らせずにIEnumerable
を受け入れるために便利です多くの状況があります。
一方、ICloneable
は有用であり得ます。例えば、ベース・クラスは有用有用クローン化することができ、そのいくつかの誘導体、の数、およびいくつかのできなかったのをサポートするかもしれません。基本型自体はパブリッククローニングインタフェースを露出場合、クローン化することができなかった任意の誘導体型はリスコフの置換原則に違反することになります。この問題を回避する方法は、保護されたメソッドを使用してクローニング基本型をサポートしている、と彼らは合うように派生型がパブリッククローニングインタフェースを実装できるようにすることです。
と、WonderfulBase
タイプのオブジェクトを受け入れることを望む、それをクローニングすることができる必要がある方法は、クローニングをサポートWonderfulBaseオブジェクト(塩基とジェネリック型パラメータを使用して受け入れるように符号化することができますタイプとICloneable
制約)。 ICloneable
インタフェース自体が深い又は浅いクローンを示さないであろうが、WonderfulBase
のドキュメントは、複製可能WonderfulBase
がディープまたは浅いクローニングしなければならないかどうかを示すであろう。基本的に、ICloneable
インタフェースは、それがすべての異なるクローン可能基底クラスに異なる名前を定義することを避けるということを除いて、ICloneableWonderfulBase
を定義することによって達成されない何かを達成していないでしょう。
ICloneable
が議論されているBCLのそれらの成果物の一つです。それを実装する本当の理由の私見ではありません。それは私が、cloneメソッドを作成するつもりならば、私はICloneable
を実装しない、と私はClone
の私自身の強い型指定されたバージョンを提供言ってます。
ICloneable
の問題はClone
は非常に異なるものです浅いか深いコピーした場合、それが示されることはありません。何ICloneable<T>
がないという事実は、ICloneable
マットが正しいか、それを使用しないでください。独自のCopy()
方法(または類似した名前)を作成し、あなたの方法は、あなたのオブジェクトのディープまたは簡易コピーを作成しているかどうかをあなたの公開APIにのそれはの完全に明確にしてます。