Функция MemberwiseClone
создает новые объекты, поля которых являются побитовыми копиями полей в исходной структуре. Это необходимая часть любого наследуемого класса, который позволяет клонировать без использования Reflection или сериализации, но это лишь небольшая часть общей головоломки.
Если вы хотите разрешить клонирование в наследуемом классе, вы должны определить protected virtual T BaseClone<T>()
метод клонирования; класс базового уровня, который происходит от Object
, должен вызывать base.MemberwiseClone
; все остальные классы должны использовать base.BaseClone<T>
, чтобы получить новый экземпляр, а затем заменить любые изменяемые клонируемые поля на клоны полей исходного объекта.
Я бы также рекомендовал определить следующие интерфейсы:
interface ISelf<out T> {T Self();}
interface ICloneable<out T> : ISelf<T> {T Clone();}
Это позволит в ситуациях, когда у класса могут быть некоторые потомки, которые могут быть клонированы, а некоторые - нет. Те, которые могут быть клонированы, могут открывать общедоступные методы клонирования (которые должны быть связаны BaseClone<theirOwnType>
). Методы, которым нужны клонируемые производные базового типа, могут использовать параметры типа ICloneable<theBaseType>
; это позволит им принимать любые клонируемые производные базового типа, даже если не все такие производные имеют общий базовый класс.