G'day,
Если вы обнаружите, что вам нужно преобразовать производный класс из одного производного в другой производный тип, то пахнет тем, что первоначальный проект имеет проблемы.
Мое ощущение здесь в том, что вы неправильно представляете объект Manager.
Вернитесь к основам и подумайте в терминах ОО, где ваш базовый класс (контакт) содержит общие элементы объектов Employee и Manager. Любые производные объекты являются просто специализациями базового класса.
В этом случае менеджер не является экземпляром сотрудника?
Как классы Manager, так и класс Employee должны иметь элемент reportTo для данных, который также имеет тип Employee.
Единственное отличие, которое я вижу на данный момент, состоит в том, что объект Manager теперь имеет коллекцию объектов Employee, которые являются их собственными directReports. Вероятно, это должно быть реализовано в виде указателя на контейнер объектов Employee.
Я не могу представить себе какую-либо специализацию в поведении, которая должна отделять объект Employee от объекта Manager.
Хммм, возможно, сделайте базовый класс Person, который содержит контактные данные.
Редактировать: Извините, из вашего комментария, я думаю, я не достаточно ясно. То, что я описал, не приводит к двум отдельным классам, которые напрямую получены из вашего класса Contact, так что вы должны изменить экземпляр Employee на Manager во время выполнения, что было вашим первоначальным вопросом.
То есть я не думаю, что у вас должно быть два производных класса, Employee и Manager, которые наследуются напрямую от вашего класса Contact.
Разве это не те случаи, когда люди работают в компании? Почему следует различать менеджера и сотрудника? Сотрудник больше не является Сотрудником, если он стал Менеджером?
Наличие двух производных классов, менеджера и сотрудника, совершенно неверно. Вы пытались сломать вещи с точки зрения "Иса" и "имеет" отношения. Тогда вы можете увидеть, что ваша базовая структура неверна.
Сказать «isa» Контакт сотрудника просто не имеет смысла. Скорее всего, Сотрудник "isa" Персона и Персона "имеет" набор Контактных данных.
Может быть, вывести класс менеджера как специализацию сотрудника? Сотрудник "isa" Персона. Менеджер "isa" Сотрудник, который "isa" Персона.
НТН
ура