Если родительский класс и все его предки реализуют свой метод Clone
, вызывая метод родительского класса 'Clone
, вплоть до Object.clone
, и если ни одно из полей, добавленных подклассом, не содержит ссылок к вещам, которые должны изменяться на одном объекте, не влияя на другой, тогда можно просто наследовать клон, не переопределяя его. Если родительский класс реализует метод клонирования, как описано выше, но подкласс добавляет поля, которые сами должны быть клонированы, лучшим вариантом для подкласса будет вызвать base.Clone
, а затем клонировать соответствующие поля.
Если родительский класс или любой предок не реализует свой метод Clone
, как описано выше, но вместо этого использует конструктор копирования, тогда производный класс и все базовые классы, производные от него) должны переопределить Clone
, чтобы сделать аналогичным образом независимо от того, добавляет ли базовый класс какие-либо новые поля.
К сожалению, я не знаю хорошего способа определить, к какой категории принадлежит родительский класс. Если родительский класс поддерживает Clone
, вызывая base.Clone
, было бы неудачно для производного класса без необходимости разорвать цепочку путем реализации конструктора копирования. С другой стороны, если родительский класс реализует Clone
как конструктор копирования, базовый класс, который этого не делает, будет иметь нарушенную семантику.