Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   FreePascal Kindmethode aus Elternklasse aufrufen (https://www.delphipraxis.net/190092-kindmethode-aus-elternklasse-aufrufen.html)

Benedikt Magnus 29. Aug 2016 18:58

Kindmethode aus Elternklasse aufrufen
 
Hallo zusammen,

ich habe derzeit folgende Struktur:

Delphi-Quellcode:
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;
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?
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?

Aviator 29. Aug 2016 19:01

AW: Kindmethode aus Elternklasse aufrufen
 
Override und dann in der KindMethode inherited aufrufen sollte funktionieren.

Benedikt Magnus 29. Aug 2016 19:06

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?

dummzeuch 29. Aug 2016 19:24

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.

Benedikt Magnus 29. Aug 2016 19:27

AW: Kindmethode aus Elternklasse aufrufen
 
Das war es! Vielen Dank, dummzeuch, jetzt klappt es genau, wie ich es mir vorgestellt hatte!

DeddyH 29. Aug 2016 20:17

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]

himitsu 29. Aug 2016 20:33

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.

DeddyH 29. Aug 2016 20:38

AW: Kindmethode aus Elternklasse aufrufen
 
Achwas :stupid:

Benedikt Magnus 29. Aug 2016 21:05

AW: Kindmethode aus Elternklasse aufrufen
 
Zitat:

Zitat von DeddyH (Beitrag 1346103)
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]

Abstrakt kann sie nicht sein, weil die Elternklasse in diesem Fall bereits eine Implementation vornimmt, die Kindklasse erweitert sie nur.

Zitat:

Zitat von himitsu
Virtual ist "schneller", aber es kommt drauf an, wofür man es braucht.

Wo ist denn der Unterschied zwischen beiden?

himitsu 29. Aug 2016 21:12

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 15:56 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz