Angenommen, ich habe zwei Klassen:
%Vor%und
%Vor%Ich weiß, dass sowas nicht funktionieren wird, da ich auf C # nicht ablehnen kann:
%Vor%Meine Frage ist: Wie kann ich auf effiziente Art und Weise downcast erreichen? Eigentlich habe ich einen Konstruktor auf AdvancedEmployee, der einen Employee als Parameter verwendet und ihn verwendet, um seine Werte zu injizieren, was im Grunde genommen einen Klon erzeugt.
Aktualisieren
Um die Daten zu lösen, die dupliziert werden sollten, habe ich den Ansatz ein wenig geändert und jetzt enthält AdvancedEmployee einen Angestellten, anstatt selbst einer zu sein. Beispiel:
%Vor%Erstellen Sie eine Schnittstelle. Und da Sie Mitarbeiter nicht ändern können, erstellen Sie einen Adapter , den Sie besitzen:
%Vor%Hier ist ein Weg, wie ich es in der Vergangenheit gehandhabt habe, was ich für ziemlich cool hielt ... Wenn alle Datenelemente in Employee und AdvancedEmployee Eigenschaften sind, können Sie die Datenwerte aus der Basisklasse mit Reflection kopieren die abgeleitete Klasse. Dann können Sie mit der abgeleiteten Klasse so arbeiten, als wäre er ursprünglich so typisiert, ohne die Basisklasse einzukapseln.
%Vor% as
in C # prüft auf den Laufzeittyp . Das heißt, wenn das zu testende Objekt in der Tat kein AdvancedEmployee
ist, wird es nicht magisch Employee
in AdvancedEmployee
konvertieren. Wenn Sie also ein AdvancedEmployee
benötigen, müssen Sie es irgendwie selbst konstruieren.
Je nachdem, was Sie erreichen werden, gibt es verschiedene Ansätze. Vielleicht können Sie mit einem Konstruktor AdvancedEmployee(Employee proto)
machen, der die benötigten Werte aus dem proto
kopiert? Oder vielleicht müssen Sie das vorhandene Employee
mit einem AdvancedEmployee
umbrechen.
Beachten Sie, dass Sie den Code, der den alten Mitarbeiter speichert, möglicherweise durch Ihren neu erstellten AdvancedEmployee
ersetzen lassen müssen.
Ein Weg (mit etwas Java-Geschmack) könnte sein, eine Employee
factory zu erstellen, die bei Bedarf einen AdvancedEmployee
erzeugt. Dann müssen Sie sicherstellen, dass der gesamte Code die Factory verwendet, anstatt ein Employee
mit new
zu erstellen. Dieses Szenario würde jedoch nicht helfen, wenn Sie sowieso Ihren Laufzeittyp ändern müssen.