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