![]() |
Klasse sich selbst in eine abgeleitete konvertieren
Hallo,
ich habe eine abstrakte Klasse, die im Konstruktor ermittelt um welche Konkrete Klasse es sich handelt. Kann ich das irgendwie bewerkstelligen, dass sie sich nun selbst in die konkrete Klasse konvertiert? Der konstruierenden Instanz sollte es eigentlich egal sein, welche konkrete Klasse erzeugt wird. Somit muss es diese selbst bewerkstelligen. Lange Rede kurzer Sinn, ich will einfach eine Klasse sich selbst upgraden lassen: z.B. in einer Methode "Aufrüsten" TTransporter wird zu TSchweineTransporter. (TSchweineTransporter ist von TTransporter abgeleitet) |
Re: Klasse sich selbst in eine abgeleitete konvertieren
Das klingt ein bisschen Wirr.
Meinst Du vielleicht das sogenannte ![]() Ansonsten macht die Geschichte nicht viel Sinn: Die abstrakte Basisklasse kann den eigentlichen Typen gar nicht kennen. Man stelle sich vor, die abstrakte Basisklasse liegt in einem Package, ein anderer Entwickler verwendet das Package und leitet von ihr ab - z.B. von TTransporter auf THühnerTransporter. Diese Klasse liegt dann in einem Package, das von Deinem Package abhängt. Deine Basisklasse wird daher nie alle seine Ableitungen kennen und dorthin casten können. Das eigentliche Objekt ist im übrigen immer vom konkreten Typ. Das heisst wenn eine methode zwangsläufig einen Schweinetransporter braucht und nur einen Transporter erhält, dann muss sie sich selber drum kümmern zu gucken ob da Schweine reinpassen und ihn nötigenfalls zum Schweinetransporter runtercasten. |
Re: Klasse sich selbst in eine abgeleitete konvertieren
An das Factory-Pattern habe ich auch gedacht. Aber dann hätte ja die Factory auch über das Wissen verfügen müssen, wie Entschieden wird welche konkrete Klasse im Endeffekt erstellt werden muss.
Ich habe nun eine Methode gefunden, wie nur die eine abstrakte Klasse das wissen muss. Und in meinem Fall muss die abstrakte Klasse nicht alle Ableitungen kennen. Ich arbeite mit "GetClass(string)"
Delphi-Quellcode:
var Transporter : TTransporter;
Transporter := TTransporter.CreateInstanz('TSchweineTransporter');
Delphi-Quellcode:
class function TTransporter.CreateInstanz(EntryValue: string): TTransporter;
var tmp : TPersistentClass; begin tmp := GetClass(EntryValue); if not Assigned(tmp) or tmp.InheritsFrom(TTransporter) then begin Result := nil; raise Exception.Create('Fehler!'); end else Result := TTransporter(tmp); end; |
Re: Klasse sich selbst in eine abgeleitete konvertieren
|
Re: Klasse sich selbst in eine abgeleitete konvertieren
Was hältst du von Klassenreferenztypen :
Zitat:
|
Re: Klasse sich selbst in eine abgeleitete konvertieren
Vielleicht kannst du Aggregation statt Vererbung benutzen? Also den Teil der Funktionalität, der "aufgerüstet" werden muss, in eine eigene, nicht von TTransporter abgeleitete Klassenhierachie auslagern, und eine passende Klasse instantiieren. TTransporter hätte also eine Referenz auf (z.B.) TTransporterVerhalten, die du z.B. auf eine Instanz von TSchweineTransporterVerhalten zeigen lässt.
|
Re: Klasse sich selbst in eine abgeleitete konvertieren
Klassenrefenzen benutze ich ja quasi schon.
Delphi-Quellcode:
Nur wie bringe ich ihn den Konstruktor der Klasse TSchweineTransporter auszufühen und mir ein solches Objekt zu erzeugen?
tmp : TPersistentClass;
tmp := GetClass(EntryValue); wenn ich
Delphi-Quellcode:
ausführe, dann führt er nur den Konstruktor der Klasse TPersistent aus, was ja eigentlich auch logisch ist. Aber irgendwie ist doch da noch mein TSchweineTransporter mit drin, sonst würde ja
tmp.Create;
Delphi-Quellcode:
nicht TRUE zurückgeben.
tmp.InheritsFrom(TTransporter)
Oder führt da kein Weg am Factory-Pattern vorbei? P.S.: Bitte nicht über die Logik von Transportern und Schweinetransportern nachdenken, das ist nur ein Pseudonym. |
Re: Klasse sich selbst in eine abgeleitete konvertieren
Delphi-Quellcode:
Ungetestet, sollte aber gehen
Type
TTransporterClass = Class of TTransporter; class function TTransporter.CreateInstanz(EntryValue : TTransporterClass): TTransporter; begin Result := EntryValue.Create; end; |
Re: Klasse sich selbst in eine abgeleitete konvertieren
Negativ
Hierbei würde nur der Konstruktor von TTransporter ausgeführt werden, nicht aber der von TSchweineTransporter. "Würde", weil ich "GetClass" verwende, was mir ein "TPersistent" zurück gibt. Müsste dann auch funktionieren, tut es aber leider nicht. (Ableitung Schaut folgendermaßen aus: TObject -> TPersistent -> TTransporter -> TSchweineTransporter) |
Re: Klasse sich selbst in eine abgeleitete konvertieren
Wenn du den constructor der abgeleiteten Klasse aufrufen willst, musst du den von TTransporter virtual machen und den abgeleiteten override.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz