AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Kindmethode aus Elternklasse aufrufen

Ein Thema von Benedikt Magnus · begonnen am 29. Aug 2016 · letzter Beitrag vom 30. Aug 2016
Antwort Antwort
Seite 1 von 2  1 2      
Benedikt Magnus

Registriert seit: 6. Jul 2012
Ort: Bonn
190 Beiträge
 
FreePascal / Lazarus
 
#1

Kindmethode aus Elternklasse aufrufen

  Alt 29. Aug 2016, 19:58
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?
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Kindmethode aus Elternklasse aufrufen

  Alt 29. Aug 2016, 20:01
Override und dann in der KindMethode inherited aufrufen sollte funktionieren.
  Mit Zitat antworten Zitat
Benedikt Magnus

Registriert seit: 6. Jul 2012
Ort: Bonn
190 Beiträge
 
FreePascal / Lazarus
 
#3

AW: Kindmethode aus Elternklasse aufrufen

  Alt 29. Aug 2016, 20:06
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?

Geändert von Benedikt Magnus (29. Aug 2016 um 20:09 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.623 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Kindmethode aus Elternklasse aufrufen

  Alt 29. Aug 2016, 20:24
In der Elternklasse virtual (aber nicht abstract) deklarieren und die Implementation leer lassen. In der Kindklasse override deklarieren und implementieren.
Thomas Mueller
  Mit Zitat antworten Zitat
Benedikt Magnus

Registriert seit: 6. Jul 2012
Ort: Bonn
190 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Kindmethode aus Elternklasse aufrufen

  Alt 29. Aug 2016, 20:27
Das war es! Vielen Dank, dummzeuch, jetzt klappt es genau, wie ich es mir vorgestellt hatte!
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#6

AW: Kindmethode aus Elternklasse aufrufen

  Alt 29. Aug 2016, 21:17
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]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen

Geändert von DeddyH (29. Aug 2016 um 21:24 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

AW: Kindmethode aus Elternklasse aufrufen

  Alt 29. Aug 2016, 21:33
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.
$2B or not $2B

Geändert von himitsu (29. Aug 2016 um 21:38 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#8

AW: Kindmethode aus Elternklasse aufrufen

  Alt 29. Aug 2016, 21:38
Achwas
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benedikt Magnus

Registriert seit: 6. Jul 2012
Ort: Bonn
190 Beiträge
 
FreePascal / Lazarus
 
#9

AW: Kindmethode aus Elternklasse aufrufen

  Alt 29. Aug 2016, 22:05
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 von himitsu:
Virtual ist "schneller", aber es kommt drauf an, wofür man es braucht.
Wo ist denn der Unterschied zwischen beiden?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#10

AW: Kindmethode aus Elternklasse aufrufen

  Alt 29. Aug 2016, 22:12
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)
$2B or not $2B

Geändert von himitsu (29. Aug 2016 um 22:18 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:36 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