質問

私は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

について、Microsoftの思考上の表示であるかもしれません

マットが正しいか、それを使用しないでください。独自のCopy()方法(または類似した名前)を作成し、あなたの方法は、あなたのオブジェクトのディープまたは簡易コピーを作成しているかどうかをあなたの公開APIにのそれはの完全に明確にしてます。

scroll top