![]() |
Kindmethode aus Elternklasse aufrufen
Hallo zusammen,
ich habe derzeit folgende Struktur:
Delphi-Quellcode:
Das klappt aber nicht. TKindklasse.InitialisiereNeustart wird niemals aufgerufen, was ja auch durchaus Sinn ergibt, da die Elternklasse die Methode der Kindklasse nicht kennt, oder?
type
TElternklasse = class protected procedure VerarbeiteWerte; procedure InitialisiereNeustart; end; type TZwischenklasse = class (TElternklasse) end; type TKindklasse = class (TZwischenklasse) proctected procedure InitialisiereNeustart; end; procedure TElternklasse.VerarbeiteWerte; begin //Verarbeitung... InitialisiereNeustart; end; procedure TElternklasse.InitialisiereNeustart; begin //Initialisierung... end; procedure TKindklasse.InitialisiereNeustart; begin inherited; //Mache noch mehr. end; Ich habe nun überlegt, in der Elternklasse eine abstrakte Methode zu deklarieren, die in TElternklasse.InitialisiereNeustart aufgerufen und in der Kindklasse implementiert wird. Das erscheint mir aber unschön, daher meine Frage: Ließe sich das eleganter umsetzen? |
AW: Kindmethode aus Elternklasse aufrufen
Override und dann in der KindMethode inherited aufrufen sollte funktionieren.
|
AW: Kindmethode aus Elternklasse aufrufen
Das habe ich ja probiert, klappt aber nicht.
Und wenn ich "override" benutzt, meckert er: "Error: There is no method in an ancestor class to be overridden: "InitialisiereNeustart;" (Lazarus/CodeTyphon) Edit: Oder hat die ganze Sache was damit zu tun, dass ich diese Zwischenklasse habe? |
AW: Kindmethode aus Elternklasse aufrufen
In der Elternklasse virtual (aber nicht abstract) deklarieren und die Implementation leer lassen. In der Kindklasse override deklarieren und implementieren.
|
AW: Kindmethode aus Elternklasse aufrufen
Das war es! Vielen Dank, dummzeuch, jetzt klappt es genau, wie ich es mir vorgestellt hatte!
|
AW: Kindmethode aus Elternklasse aufrufen
Statt Virtual würde auch Dynamic funktionieren.
[edit] Wieso nicht abstract? Wenn die Elternklasse die Methode nicht wirklich implementiert, kann man sie doch auch gleich als abstrakt deklarieren. Allerdings führt das dann zu einer Warnung, wenn man die Elternklasse instanzieren will. [/edit] |
AW: Kindmethode aus Elternklasse aufrufen
Virtual ist "schneller", aber es kommt drauf an, wofür man es braucht.
abstact: wenn alle Ableitungen das implementieren müssen und es knallen soll, wenn man es nicht macht nicht abstract: wenn es auch ohne Funktion aufrufbar sein soll und die/einige Ableitungen die Funktion nur erweitern Beispiel: TStream kann nichts und die Nachfahren müssen alles implementieren TStream.Seek gibt es aber in 2 Version (32 und 64 Bit) und man braucht nur eine der beiden Varianten zu implementieren. |
AW: Kindmethode aus Elternklasse aufrufen
Achwas :stupid:
|
AW: Kindmethode aus Elternklasse aufrufen
Zitat:
Zitat:
|
AW: Kindmethode aus Elternklasse aufrufen
Bei Virtual wird direkt die "aktuelle" Methodenadresse in der VMT (VirtualMethodTable, 'nen Array aus Pointern) der Klasse gespeichert und der CALL kann das direkt auslesen (als Index/Offset) und sofort anspringen.
Bei Dynamic wird die Adresse in einer Name/Pointer-Liste gespeichert und beim CALL wird über den Methodennamen erstmal der Pointer in der Liste gesucht und dann angesprungen. Ist mehr für COM-Objekte gedacht, welche "dynamisch" aufgerufen werden, da wird halt erst zur Laufzeit in 'nem "unbekannten" Interface (IUnknown) die Methode gesucht. (wenn ich das jetzt nicht komplett durcheinandergebracht hab, aber zumindestens Virtual ist richtig) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:56 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