![]() |
Object via Typecast erzeugen
@Mods - Bitte korrigiert den Titel falls euch was besseres einfällt:
Ich versuche folgendes:
Delphi-Quellcode:
sieht vielleicht eigenartig aus - aber nur weils komplett zusammengekürzt ist. Liegt deutlich mehr dahinter :-)type TxObject = class public constructor Create; end; TxUser = class(TxObject) public constructor Create; end; TxObjectClass = class of TxObject; [...] var o: TxObject; fOwnerClass: TxObjectClass; begin fOwnerClass := TxUser; // HIER o := TxObject(fOwnerClass.Create); //... [..] end; Der Code oben funktioniert zwar, allerdings wird der Constructor von TxUser NIE aufgerufen. Warum? Bin mir leider auch nicht ganz sicher nach was ich hier / Google suchen hätte sollen. Danke, Daniel |
Re: Object via Typecast erzeugen
Mach den Konstruktor von TxObjekt virtuell und gib dann in TxUser die Direktive override an.
|
Re: Object via Typecast erzeugen
Ach natürlich... Danke dir recht herzlich.
macht, wenn folgendes der fall ist, auch keine Probleme oder?
Delphi-Quellcode:
Hier werden dann auch der Constructor von TxDBObject + TxObject aufgerufen, oder?
TxDBObject = class
public constructor Create; end; TxObject = class(TxDBObject) public constructor Create; virtual; end; TxUser = class public constructor Create; end; |
Re: Object via Typecast erzeugen
Du musst bedenken, was der Compiler macht. Wenn du fOwnerClass.Create schreibst, sieht der Compiler, dass fOwnerClass "mindestens" TxObject ist; das Create bezeichnet also den Konstruktor von TxObject. Nur wenn dieser Konstruktor virtuell ist, wird ein virtueller Dispatch angestoßen; ansonsten wird nur der Konstruktor von TxObject aufgerufen. Wenn du erst in einer abgeleiteten Klasse den Konstruktor virtuell machst, hilft dir das nichts mehr.
Um zu deiner Frage zurückzukommen: Wenn deine Klassenreferenz den Typ class of TxDBObject hat, wird nur TxDBObject.Create aufgerufen; wenn es sich jedoch um class of TxObject handelt, wird virtuell dispatcht. Ob ein geerbter Konstruktor aufgerufen wird, richtet sich nach dem Vorkommen der inherited-Klausel. |
Re: Object via Typecast erzeugen
Nochmal danke für die ausführliche Erklärung.
Geholfen hats schon mal aber bin mir nicht sicher ob ich dich verstanden hab: TxUser >Nachfahre von> TxObject > Nachfahre von > TxdbObject Wenn TxObject.Constructor = virtuell => - TxUser MUSS einen überschriebenen Constructor (mit inherited) haben - TxObjects' Constructor WIRD aufgerufen. - TxdbObject Constructor WIRD NICHT aufgerufen? Wenn ich jetzt STATT(!) bei TxObject den Constructor bei TxdbObject virtuell mache: - Wird der Constructor von TxObject AUCH beim Erzeugen von einem TxUser aufgerufen, oder nur der von TxdbObject und TxUser. - Sollte ich dann beide Constructor (TxObject + TxdbObject) virtuell machen? Danke! |
Re: Object via Typecast erzeugen
Beim Überschreiben von Methoden solltest du auch beachten, sie mit override zu deklarieren - ansonsten wird dir sowieso eine Warning beim Kompilieren ausgegeben, dass sie die Methode der Vorgängerklasse verdecken.
Beispiel:
Delphi-Quellcode:
Wenn du eine Instanz von TxUser erstellst und Foo aufrufst, wird diese korrekt von der Klasse TxUser aufgerufen. Solltest du aber diese Instanz in einer Variable vom Typ TxObject speichern und dann Foo aufrufen, würde im obigen Beispiel die Methode von der Klasse TxObject aufgerufen und nicht die deiner tatsächlichen instanzierten Klasse. Dies würde nur geschehen, wenn du TxUser.Foo mit override kennzeichnest.
TxDBObject = class
public constructor Create; end; TxObject = class(TxDBObject) public constructor Create; virtual; procedure Foo; virtual; end; TxUser = class(TxObject) public constructor Create; procedure Foo; end; Zitat:
Zitat:
|
Re: Object via Typecast erzeugen
Zitat:
Des Weiteren musst du virtuelle Methoden oder Konstruktoren nicht überschreiben. Dies wäre lediglich der Fall bei abstrakten Methoden. Wenn kein expliziter Override angegeben wird, nimmt der Compiler einfach den der Elternklasse (d.h. hier TxObject). |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:37 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-2025 by Thomas Breitkreuz