Представьте, что у вас есть производный класс, где базовый класс - это то, что вы не можете изменить.Базовый класс имеет много состояний (много непостоянных закрытых членов) и множество конструкторов с различным количеством аргументов для инициализации некоторого подмножества состояния (размер подмножества, конечно, зависит от конструктора).
Теперь мой производный класс - очень легкая оболочка над базовым классом.Давайте предположим, что он не добавляет свое собственное состояние и лишь незначительно изменяет поведение пары методов (возможно, делает некоторые дополнительные записи в журнал при вызове super.originalMethod()
).
Проблема, которую я имею, заключается в том, что я хочу принятьобъект базового класса и создать его «копию» с тем же состоянием, но в качестве экземпляра моего производного класса.
Это оказывается трудным.Я не могу вызвать «самый полный» конструктор базового класса, передавая все состояние из источника, вызывая геттеры, поскольку в зависимости от того, как был построен базовый класс, некоторые значения состояния могут быть отклонены этим конструктором.Например, вы можете создать объект по умолчанию с 0-arg ctor, любые значения будут нулевыми.Однако не разрешено передавать нулевые значения в ctor, который позволяет вам указывать эти значения.
Кроме того, вышеописанный метод хрупок, потому что если происходит изменение базового класса, которое добавляет больше состояния, идобавлен «еще более полный» конструктор (или состояние, которое не может быть установлено в конструкторе, но только с помощью методов доступа), копия больше не будет завершена.
То, что я хочу, похоже на `clone (), а скорее инициализирует новый объект того же типа, инициализирует членов базового класса производного класса.Я думаю, что такой вещи не существует.Любые предложения по шаблону, которые могут предложить что-то эквивалентное?
Имейте в виду, я не могу изменить базовый класс.Если бы я мог, это было бы намного проще.