Интерфейс ICloneable
сам по себе не очень полезно, что сказать, что на самом деле не так много ситуаций, когда это полезно знать, что объект является клонируемыми, ничего не зная еще об этом. Это совсем другая ситуация, например, IEnumerable
или IDisposable
; существует множество ситуаций, когда полезно принять IEnumerable
, не зная ничего, кроме как перечислить его.
С другой стороны, ICloneable
может быть полезен при применении в качестве общего ограничения наряду с другими ограничениями. Например, базовый класс может с пользой поддерживать ряд производных, некоторые из которых могут быть полезны для клонирования, а некоторые из них не могут. Если базовый тип сам отображал открытый интерфейс клонирования, то любой производный тип, который не мог быть клонирован, нарушал бы принцип замены Лискова. Способ избежать этой проблемы состоит в том, чтобы клонирование поддержки базового типа с использованием защищенного метода и разрешить производным типам реализовывать открытый интерфейс клонирования по своему усмотрению.
После того, как это было выполнено, метод, который хочет принять объект типа WonderfulBase
и должен быть способен клонировать его, может быть закодирован для принятия объекта WonderfulBase, который поддерживает клонирование (с использованием параметра типового типа с базой -тип и ICloneable
). Хотя интерфейс ICloneable
сам по себе не указывает на глубокое или мелкое клонирование, в документации для WonderfulBase
указывается, должен ли клонируемый WonderfulBase
быть глубоким или мелко-клонированным. По сути, интерфейс ICloneable
не выполнил бы ничего, что не было бы достигнуто путем определения ICloneableWonderfulBase
, за исключением того, что он избегал бы определять разные имена для каждого другого клонируемого базового класса.
** См. Также **: [ICloneable Controversy: должен ли класс реализовывать ICloneable или нет?] (Http://www.sysexpand.com/?path=howto/implement-icloneable-or-not) – KyleMit