Задаваемый вопрос - PullRequest
       36

Задаваемый вопрос

3 голосов
/ 28 ноября 2010

Если класс реализован ICloneable, что это значит?

Ответы [ 4 ]

6 голосов
/ 28 ноября 2010

То есть имеет метод IClonable.Clone. В документации сказано, что метод предназначен для клонирования объектов. В документации особо отмечается, что клон может быть либо глубоким, либо неглубоким. Также отмечается, что результирующий тип должен быть того же типа, что и клонированный объект, но в системе типов нет гарантии, что это действительно так.

Подводя итог, он не предлагает много сложных обещаний, но цель состоит в том, чтобы создать независимых клонов.

0 голосов
/ 30 ноября 2010

ICloneable сам по себе не имеет смысла, но может быть полезен в сочетании с другими ограничениями (например, можно предусмотреть, что параметр должен быть Foo, который реализует ICloneable).Таким образом, можно иметь Foo, CloneableFoo, AdvancedFoo и CloneableAdvancedFoo, что позволяет отличать производные Foo, поддерживающие клонирование, от тех, которые этого не делают, но также позволяет подпрограммам, которые ожидают, что клонируемый Foo принимает клонируемое производное Foo.

К сожалению, хотя параметр функции, переданный с ограничениями IClonable и Foo, может использоваться как IClonable и как Foo, без типов типов, нет никакого способа создать поле, удовлетворяющее этим критериям, и нет никакого способа типизироватьполе.Средством для этого может быть создание ICloneable (Of T As ICloneable (Of T)), который содержит метод «Клон», который возвращает T, и метод «Self», который также возвращает T (Таким образом, поле, содержащее «ICloneable Of Foo "может быть получен как Foo через метод" Self ").Для того, чтобы все это работало, нужно немного позаботиться, но шаблон должен быть довольно хорошим.

0 голосов
/ 28 ноября 2010

Это просто означает, что класс должен реализовывать метод Clone, который возвращает объект, не более того.Таким образом, у вас может быть метод, который принимает ICloneable, а затем вы можете клонировать этот объект.

0 голосов
/ 28 ноября 2010

По сути, он просто позволяет клонировать класс:

http://msdn.microsoft.com/en-us/library/system.icloneable.aspx

При реализации любого интерфейса необходимо определить методы в этом интерфейсе.В этом случае метод Clone должен быть определен в вашем классе.

Пример от Microsoft:

public object Clone()
{
    return this.MemberwiseClone();
}
...