Нужно ли подклассу явно переопределять метод Clone (), если суперкласс уже сделал это - PullRequest
1 голос
/ 21 октября 2010

Если класс A расширяет класс B, а в классе B уже реализован клонируемый интерфейс, то необходимо ли классу A объявить 'clone () throws CloneNotSupportedException'.

Я полагаю, что это не должно быть обязательным, поскольку свойстводля клонирования Объекты класса A будут автоматически наследоваться от класса B.

Ответы [ 2 ]

1 голос
/ 21 октября 2010

Необходимо переопределить clone(), если класс B определяет непостоянные изменяемые поля-члены.Они должны быть явно скопированы в пределах B.clone().Если B содержит только примитивные и / или неизменные элементы данных, A.clone() выполнит эту работу.

Более подробное объяснение см. этот мой более ранний ответ на аналогичный вопрос.

0 голосов
/ 18 декабря 2011

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

Если родительский класс или любой предок не реализует свой метод Clone, как описано выше, но вместо этого использует конструктор копирования, тогда производный класс и все базовые классы, производные от него) должны переопределить Clone, чтобы сделать аналогичным образом независимо от того, добавляет ли базовый класс какие-либо новые поля.

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

...