Delphi-PRAXiS

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)

Benedikt Magnus 29. Aug 2016 21:16

AW: Kindmethode aus Elternklasse aufrufen
 
Interessant, danke für die Erklärung!

bra 30. Aug 2016 12:31

AW: Kindmethode aus Elternklasse aufrufen
 
Könnte man nicht auch Self nicht nach der Basisklasse casten und dann die Funktion aufrufen?

TBx 30. Aug 2016 12:36

AW: Kindmethode aus Elternklasse aufrufen
 
Zitat:

Zitat von bra (Beitrag 1346155)
Könnte man nicht auch Self nicht nach der Basisklasse casten und dann die Funktion aufrufen?

:shock::stupid: hää?

Aviator 30. Aug 2016 12:49

AW: Kindmethode aus Elternklasse aufrufen
 
Zitat:

Zitat von TBx (Beitrag 1346156)
Zitat:

Zitat von bra (Beitrag 1346155)
Könnte man nicht auch Self nicht nach der Basisklasse casten und dann die Funktion aufrufen?

:shock::stupid: hää?

Warum einfach wenn es auch umständlich geht. :stupid: :thumb:

bra 30. Aug 2016 15:46

AW: Kindmethode aus Elternklasse aufrufen
 
Zitat:

Zitat von TBx (Beitrag 1346156)
Zitat:

Zitat von bra (Beitrag 1346155)
Könnte man nicht auch Self nicht nach der Basisklasse casten und dann die Funktion aufrufen?

:shock::stupid: hää?

TElternklasse(Self).InitialisiereNeustart;

Nee, ich glaube das geht nicht, weil protected :oops:



Zitat:

Zitat von Aviator (Beitrag 1346158)
Warum einfach wenn es auch umständlich geht. :stupid: :thumb:

:P:cyclops:

DeddyH 30. Aug 2016 15:57

AW: Kindmethode aus Elternklasse aufrufen
 
Das Problem ist ja andersherum, da der entsprechende Code bereits in der Elternklasse aufgerufen wird.

bra 30. Aug 2016 16:54

AW: Kindmethode aus Elternklasse aufrufen
 
Zitat:

Zitat von DeddyH (Beitrag 1346211)
Das Problem ist ja andersherum, da der entsprechende Code bereits in der Elternklasse aufgerufen wird.

Ups, da hab ich was vollkommen falsch verstanden. :oops:


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:52 Uhr.

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