G'day,
Wenn Sie feststellen, Sie haben eine abgeleitete Klasse von einem Typ in einen anderen abgeleiteten Typ zu konvertieren, dann ist das ein Geruch, der anfängliche Design-Probleme hat.
Mein Gefühl hier ist, dass Sie ein Manager-Objekt falsch darstellen.
Gehen Sie zurück zu den Grundlagen und denken Sie in OO-Termen, wo Ihre Basisklasse (Kontakt) die gemeinsamen Elemente von Employee und Manager-Objekten enthält. Alle abgeleiteten Objekte sind nur Spezialisierungen der Basisklasse.
In diesem Fall ist kein Manager eine Instanz eines Mitarbeiters?
Sowohl die Manager- als auch die Employee-Klasse sollten über ein reportsTo-Datenelement verfügen, das ebenfalls vom Typ Employee ist.
Der einzige Unterschied, den ich im Moment sehen kann, ist, dass ein Manager-Objekt jetzt eine Sammlung von Mitarbeiter-Objekten hat, die ihre eigenen directReports sind. Dies sollte wahrscheinlich als Zeiger auf einen Container von Employee-Objekten implementiert werden.
Ich kann mir keine Spezialisierung im Verhalten vorstellen, die ein Employee-Objekt von einem Manager-Objekt trennen muss.
Hmmm, vielleicht machen Sie die Basisklasse Person, die Kontaktdaten enthält.
Edit: Sorry, von Ihrem Kommentar Ich glaube, ich war nicht klar genug. Was ich beschrieben habe, führt nicht zu zwei separaten Klassen, die beide direkt von Ihrer Contact-Klasse abgeleitet sind, so dass Sie während der Laufzeit eine Instanz eines Mitarbeiters in einen Manager ändern müssen, was Ihre ursprüngliche Frage war.
Das heißt, ich denke nicht, dass Sie zwei abgeleitete Klassen haben sollten, einen Mitarbeiter und einen Manager, die direkt von Ihrer Kontaktklasse erben.
Sind nicht beide diese Arten von Menschen, die von einer Firma beschäftigt sind? Warum zwischen einem Manager und einem Mitarbeiter unterscheiden? Ist ein Mitarbeiter nicht länger ein Mitarbeiter, wenn er ein Manager wird?
Mit zwei abgeleiteten Klassen, einem Manager und einem Mitarbeiter, ist IMHO völlig falsch. Haben Sie versucht, Dinge in Bezug auf "isa" und "hat ein" Beziehungen zu brechen. Dann können Sie sehen, dass Ihre Grundstruktur falsch ist.
Um einen Mitarbeiter zu sagen "isa" Kontakt macht einfach keinen Sinn. Wahrscheinlicher ist, dass ein Mitarbeiter "isa" Person und eine Person "eine Reihe von Kontaktdaten hat.
Vielleicht leiten Sie die Manager-Klasse als Spezialisierung eines Mitarbeiters? Ein Mitarbeiter "isa" Person. Ein Manager "isa" Mitarbeiter, der "isa" Person ist.
HTH
prost,
Die Frage NHibernate war nur um herauszufinden, ob NHibernate sich beschweren würde, ein Objekt als Unterklasse zu speichern, wenn es als Basistyp abgerufen wurde. –