Идея состоит в том, что с помощью Clone
вы можете создать новый объект того же типа, что и тот, на котором вы его вызываете, , не зная точного типа объекта, на который вы его вызываете .
Например:
void Test(ICloneable original)
{
var cloned = original.Clone();
}
Здесь cloned
имеет тот же тип времени выполнения, что и original
, и вам не нужно было знать, что это был за тип для выполнения клонирования.
Однако полезность ICloneable
практически отсутствует, поскольку она не определяет семантику 1015 * операции клонирования: это мелкая копия или глубокая копия ?Поскольку интерфейс не требует ни того, ни другого, вы не можете точно знать, что вы получаете.А поскольку знание этого крайне важно, потому что вам необходимо соответствующим образом обращаться с клоном, сама по себе ICloneable
является в значительной степени сожженной картой.
Определение собственного интерфейса с помощью метода Clone
(с четко определенной семантикой) делаетхотя много смысла.
Обновление: См. также: Почему я должен реализовать ICloneable в c #?