ICloneableИнтерфейс сам по себе не очень полезно, что сказать , что на самом деле не так много ситуаций , когда это полезно знать , что объект является клонируемым , ничего не зная еще об этом. Это очень отличается от, например, IEnumerableили IDisposable; есть много ситуаций, когда полезно принять, IEnumerableне зная ничего, кроме как его перечислить.
С другой стороны, ICloneableможет быть полезно при применении в качестве общего ограничения наряду с другими ограничениями. Например, базовый класс может с пользой поддерживать ряд производных, некоторые из которых могут быть успешно клонированы, а некоторые - нет. Если бы базовый тип сам предоставлял общедоступный интерфейс клонирования, то любой производный тип, который не мог быть клонирован, нарушал бы принцип подстановки Лискова. Способ избежать этой проблемы состоит в том, чтобы обеспечить поддержку клонирования базового типа с помощью метода Protected и позволить производным типам реализовать общедоступный интерфейс клонирования по своему усмотрению.
Как только это будет выполнено, метод, который хочет принять объект WonderfulBaseтипа и должен иметь возможность клонировать его, может быть закодирован для принятия объекта WonderfulBase, который поддерживает клонирование (с использованием параметра универсального типа с базовым типом и ICloneableограничениями) . Хотя ICloneableинтерфейс сам по себе не будет указывать на глубокое или поверхностное клонирование, в документации для него WonderfulBaseбудет указано, WonderfulBaseдолжно ли клонироваться глубокое или поверхностное клонирование. По сути, ICloneableинтерфейс не будет выполнять ничего, чего нельзя было бы добиться путем определения ICloneableWonderfulBase, за исключением того, что он избегал бы определения разных имен для каждого отдельного клонируемого базового класса.