Вопрос

Можете ли вы объяснить мне, почему я должен наследовать от ICloneable и реализовать Clone() метод?

Если я хочу сделать глубокую копию, могу ли я просто реализовать свой метод?Скажем так MyClone()?

Почему я должен наследовать от ICloneable?Каковы преимущества?Это просто вопрос того, чтобы сделать код «более читабельным»?

Это было полезно?

Решение

Вы не должны этого делать.Microsoft рекомендует не внедрять ICloneable потому что в интерфейсе нет четкого указания, является ли ваш Clone метод выполняет «глубокое» или «поверхностное» клонирование.

Видеть это сообщение в блоге от Брэда Абрамса еще в 2003 году (!) для получения дополнительной информации.

Другие советы

А ICloneable интерфейс сам по себе не очень полезно, то есть на самом деле не так уж много ситуаций, когда было бы полезно знать, что объект можно клонировать, не зная о нем ничего другого.Это сильно отличается от ситуации, например. IEnumerable или IDisposable;Есть много ситуаций, когда полезно принять IEnumerable не зная ничего, кроме как его перечислить.

С другой стороны, ICloneable может быть полезно при применении в качестве общего ограничения вместе с другими ограничениями.Например, базовый класс может поддерживать ряд производных, некоторые из которых можно клонировать, а некоторые нет.Если бы базовый тип сам предоставлял общедоступный интерфейс клонирования, то любой производный тип, который не мог быть клонирован, нарушил бы принцип подстановки Лискова.Чтобы избежать этой проблемы, необходимо обеспечить поддержку клонирования базового типа с использованием защищенного метода и разрешить производным типам реализовывать общедоступный интерфейс клонирования по своему усмотрению.

Как только это будет выполнено, метод, который хочет принять объект WonderfulBase type и должен иметь возможность его клонировать, может быть закодирован так, чтобы принимать объект WonderfulBase, который поддерживает клонирование (с использованием параметра универсального типа с базовым типом и ICloneable ограничения).Хотя ICloneable интерфейс сам по себе не указывает на глубокое или поверхностное клонирование, документация по WonderfulBase укажет, можно ли клонировать WonderfulBase должны быть глубоко или поверхностно клонированы.По сути, ICloneable интерфейс не выполнит ничего, что не было бы достигнуто путем определения ICloneableWonderfulBase, за исключением того, что это позволит избежать необходимости определять разные имена для каждого клонируемого базового класса.

ICloneable является одним из тех артефактов BCL, которые вызывают споры.ИМХО, нет реальной причины для его реализации.С учетом вышесказанного, если я собираюсь создать метод клонирования, я реализую его. ICloneable, и я предоставляю свою собственную строго типизированную версию Clone.

Проблема с ICloneable никогда не указывается, если Clone была поверхностная или глубокая копия, а это очень разные вещи.Тот факт, что нет ICloneable<T> может быть показателем мыслей Microsoft об ICloneable

Мэтт прав, не используйте его.Создайте свой собственный Copy() метод (или похожее имя) и сделайте его совершенно ясно в вашем общедоступном API создается ли ваш метод глубокая или поверхностная копия вашего объекта.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top