Dapatkah Anda menjelaskan kepada saya mengapa saya harus mewarisi dari ICloneable
dan 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"?
c#
.net
cloneable
icloneable
uinc
sumber
sumber
Jawaban:
Seharusnya tidak. Microsoft menganjurkan agar tidak menerapkan
ICloneable
karena tidak ada indikasi yang jelas dari antarmuka apakahClone
metode Anda melakukan klon "dalam" atau "dangkal".Lihat entri blog ini dari Brad Abrams pada tahun 2003 (!) Untuk informasi lebih lanjut.
sumber
The
ICloneable
antarmuka 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 misalnyaIEnumerable
atauIDisposable
; Ada banyak situasi di mana itu berguna untuk menerimaIEnumerable
tanpa mengetahui apa pun selain bagaimana menghitungnya.Di sisi lain,
ICloneable
mungkin 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
WonderfulBase
tipe, dan perlu untuk dapat mengkloningnya, dapat dikodekan untuk menerima objek WonderfulBase yang mendukung kloning (menggunakan parameter tipe generik dengan tipe dasar danICloneable
batasan) . MeskipunICloneable
antarmuka itu sendiri tidak menunjukkan kloning dalam atau dangkal, dokumentasi untukWonderfulBase
akan menunjukkan apakah kloningWonderfulBase
harus dalam atau dangkal. Pada dasarnya,ICloneable
antarmuka tidak akan mencapai apa pun yang tidak akan dicapai dengan mendefinisikanICloneableWonderfulBase
, kecuali itu akan menghindari keharusan untuk menentukan nama yang berbeda untuk setiap kelas dasar yang dapat digandakan.sumber
ICloneable
adalah salah satu artefak di BCL yang kontroversial. Tidak ada alasan nyata IMHO untuk menerapkannya. Dengan itu, jika saya akan membuat metode klon maka saya menerapkannyaICloneable
, dan saya memberikan versi ketikan saya yang kuatClone
.Masalahnya
ICloneable
adalah tidak pernah ditunjukkan apakahClone
itu dangkal atau salinan dalam yang merupakan hal yang sangat berbeda. Fakta bahwa tidak adaICloneable<T>
indikasi pemikiran Microsoft tentang ICloneablesumber
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.sumber