ICloneable
Інтерфейс сам по собі не дуже корисно, що сказати , що на насправді не так багато ситуацій , коли це корисно знати , що об'єкт є клонують , нічого не знаючи ще про це. Це дуже відрізняється від ситуації , наприклад , IEnumerable
або IDisposable
; Є багато ситуацій, коли корисно прийняти знак, IEnumerable
не знаючи нічого, крім того, як його перерахувати.
З іншого боку, ICloneable
може бути корисним, коли застосовується як загальне обмеження разом з іншими обмеженнями. Наприклад, базовий клас може корисно підтримувати низку похідних, деякі з яких можуть бути корисно клоновані, а деякі - не. Якщо сам базовий тип виявив відкритий інтерфейс клонування, то будь-який похідний тип, який неможливо було клонувати, порушив би Принцип заміни Ліскова. Способом уникнути цієї проблеми є створення клонування підтримки базового типу за допомогою методу Protected та дозволити похідним типам реалізувати публічний інтерфейс клонування так, як вони вважають за потрібне.
Як тільки це було досягнуто, метод, який хоче прийняти об'єкт WonderfulBase
типу і потребує можливості його клонувати, може бути закодований, щоб прийняти об’єкт WonderfulBase, який підтримує клонування (використовуючи параметр загального типу з базовим типом та ICloneable
обмеженнями) . Хоча ICloneable
інтерфейс сам по собі не вказує на глибоке або неглибоке клонування, в документації на WonderfulBase
вказівку WonderfulBase
має бути, чи повинен бути клонований глибокий або мілко клонований. По суті, ICloneable
інтерфейс не виконає нічого, чого не вдасться виконати шляхом визначення ICloneableWonderfulBase
, за винятком того, що це дозволить уникнути необхідності визначення різних імен для кожного різного базового класу, що можна клонувати.