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