Mengapa saya harus menerapkan ICloneable di c #?

110

Dapatkah Anda menjelaskan kepada saya mengapa saya harus mewarisi dari ICloneabledan menerapkan Clone()metode ini?

Jika saya ingin melakukan deep copy, tidak bisakah saya menerapkan metode saya? Sebut saja MyClone()?

Mengapa saya harus mewarisi ICloneable? Apa kelebihannya? Apakah ini hanya masalah membuat kode "lebih mudah dibaca"?

uinc
sumber

Jawaban:

29

The ICloneableantarmuka dengan sendirinya tidak sangat berguna, yang mengatakan bahwa ada benar-benar tidak banyak situasi di mana itu berguna untuk mengetahui bahwa suatu objek cloneable tanpa mengetahui apa-apa lagi tentang hal itu. Ini adalah situasi yang sangat berbeda dari misalnya IEnumerableatau IDisposable; Ada banyak situasi di mana itu berguna untuk menerima IEnumerabletanpa mengetahui apa pun selain bagaimana menghitungnya.

Di sisi lain, ICloneablemungkin berguna bila diterapkan sebagai batasan umum bersama dengan batasan lainnya. Misalnya, kelas dasar mungkin berguna untuk mendukung sejumlah turunan, beberapa di antaranya dapat dikloning, dan beberapa di antaranya tidak dapat. Jika tipe dasar itu sendiri mengekspos antarmuka kloning publik, maka tipe turunan apa pun yang tidak dapat dikloning akan melanggar Prinsip Substitusi Liskov. Cara untuk menghindari masalah ini adalah memiliki kloning dukungan tipe dasar menggunakan metode Terlindungi, dan mengizinkan tipe turunan untuk mengimplementasikan antarmuka kloning publik sesuai keinginan mereka.

Setelah itu selesai, metode yang ingin menerima objek dari suatu WonderfulBasetipe, dan perlu untuk dapat mengkloningnya, dapat dikodekan untuk menerima objek WonderfulBase yang mendukung kloning (menggunakan parameter tipe generik dengan tipe dasar dan ICloneablebatasan) . Meskipun ICloneableantarmuka itu sendiri tidak menunjukkan kloning dalam atau dangkal, dokumentasi untuk WonderfulBaseakan menunjukkan apakah kloning WonderfulBaseharus dalam atau dangkal. Pada dasarnya, ICloneableantarmuka tidak akan mencapai apa pun yang tidak akan dicapai dengan mendefinisikan ICloneableWonderfulBase, kecuali itu akan menghindari keharusan untuk menentukan nama yang berbeda untuk setiap kelas dasar yang dapat digandakan.

supercat
sumber
18

ICloneableadalah salah satu artefak di BCL yang kontroversial. Tidak ada alasan nyata IMHO untuk menerapkannya. Dengan itu, jika saya akan membuat metode klon maka saya menerapkannya ICloneable, dan saya memberikan versi ketikan saya yang kuat Clone.

Masalahnya ICloneableadalah tidak pernah ditunjukkan apakah Cloneitu dangkal atau salinan dalam yang merupakan hal yang sangat berbeda. Fakta bahwa tidak ada ICloneable<T>indikasi pemikiran Microsoft tentang ICloneable

JoshBerke
sumber
9

Matt benar, jangan gunakan itu. Buat Copy()metode Anda sendiri (atau nama yang mirip) dan perjelas di API publik Anda apakah metode Anda membuat salinan dalam atau dangkal dari objek Anda.

John Rasch
sumber