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 misalnya IEnumerable
atau IDisposable
; Ada banyak situasi di mana itu berguna untuk menerima IEnumerable
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 dan ICloneable
batasan) . Meskipun ICloneable
antarmuka itu sendiri tidak menunjukkan kloning dalam atau dangkal, dokumentasi untuk WonderfulBase
akan menunjukkan apakah kloning WonderfulBase
harus dalam atau dangkal. Pada dasarnya, ICloneable
antarmuka 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.