Cast-Basisinstanz in C # in abgeleitete Klasse (downcast)

8

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%     
Israel Lot 16.04.2012, 10:53
quelle

5 Antworten

4

Erstellen Sie eine Schnittstelle. Und da Sie Mitarbeiter nicht ändern können, erstellen Sie einen Adapter , den Sie besitzen:

%Vor%     
Torbjörn Kalin 16.04.2012 11:10
quelle
3

Es kann keine Umwandlung sein , es ist tatsächlich eine Umwandlung zwischen verschiedenen Typen.

Ich würde eine ctor- oder statische Member-Funktion wie AdvancedEmployee FromBase(Employee e) hinzufügen, zu construct abgeleiteten Typ vom gegebenen Basistyp.

    
Tigran 16.04.2012 10:57
quelle
2

Das Erstellen eines neuen Objekts ist der am besten lesbare und klarste Weg. Sie können auch explizite oder implizite Typkonvertierungsoperatoren in Ihrer Employee-Klasse definieren.

%Vor%

Und dann benutze es so:

%Vor%     
2kay 16.04.2012 10:59
quelle
2

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%     
John 20.04.2016 19:58
quelle
1

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.

    
Vlad 16.04.2012 10:58
quelle

Tags und Links