día G,
Si usted encuentra que tiene para convertir una clase derivada de un tipo a otro tipo derivado entonces que es un olor que el diseño inicial tiene problemas.
Mi intuición aquí es que está representando un objeto Manager incorrectamente.
Vuelva a los conceptos básicos y piense en términos OO donde su clase base (Contacto) contiene los elementos comunes de los objetos Empleado y Administrador. Todos los objetos derivados son solo especializaciones de la clase base.
En este caso, ¿no es un Administrador una instancia de un Empleado?
Las clases Manager y Employee deberían tener un miembro de datos de reportsTo que también sea del tipo Employee.
La única diferencia que puedo ver en este momento es que un objeto Manager ahora tiene una colección de objetos Employee que son sus propios DirectReports. Esto probablemente debería implementarse como un puntero a un contenedor de objetos Employee.
No puedo pensar en ninguna especialización en comportamiento que necesite separar un objeto Employee de un objeto Manager.
Hmmm, tal vez haga la clase base Persona que contiene detalles de contacto en ella.
Edit: Lo siento, por tu comentario, supongo que no fui lo suficientemente claro. Lo que describí no conduce a dos clases separadas, ambas derivadas directamente de su clase de contacto, por lo que debe cambiar una instancia de un empleado a un administrador durante el tiempo de ejecución, que era su pregunta original.
Es decir, no creo que deba tener dos clases derivadas, un Empleado y un Administrador, heredando directamente de su clase de Contacto.
¿No son estos ejemplos de tipos de personas que son empleados de una empresa? ¿Por qué distinguir entre un gerente y un empleado? ¿Un empleado ya no es un empleado si se convierte en un gerente?
Tener dos clases derivadas, un gerente y un empleado, es completamente incorrecto en mi humilde opinión. Has intentado dividir las cosas en términos de relaciones "isa" y "tiene". Entonces puedes ver que tu estructura básica está equivocada.
Decir un empleado "isa" El contacto simplemente no tiene sentido. Es más probable que un empleado "isa" Persona y una persona "tenga" un conjunto de detalles de contacto.
¿Tal vez derivar la clase Manager como una especialización de un empleado? Un empleado "isa" Persona. Un gerente "isa" Empleado que es "isa" Persona.
HTH
aplausos,
La pregunta de NHibernate fue solo para averiguar si NHibernate se quejaba de guardar un objeto como una subclase cuando se recuperaba como tipo de base. –