![]() |
inherited für Vorfahren-Methode aufrufen
Mir ist so recht nicht der richtige Titel eingefallen und wie ich nach diesem Thema suchen soll ???????
Hier das Problem: Ich habe eine eigene Klasse mit Eigenschaften und überschriebenen Methoden des Vorfahren. Eine weitere vererbte Klasse meiner neuen Klasse soll aber eine virtuelle Methode des alten Vorfahren mit inherited aufrufen. Wie mach ich das? hier ein Beispiel:
Delphi-Quellcode:
Jetzt soll in MyNewControl per inherited aber die Methode Paint aus TCustomControl aufgerufen werden. Schreibe ich es so:
TMyBaseControl = class(TCustomControl)
private FfirstProperty : string; protected procedure Paint; override; end; TMyNewControl = class(TMyBaseControl) protected procedure Paint; override; end;
Delphi-Quellcode:
wird ja der Code aus MyBaseControl.Paint aufgerufen. Wie ist der Aufruf aber für Paint des TCustomControl?
procedure TMyNewControl.Paint;
begin inherited Paint; end; so?
Delphi-Quellcode:
oder muß ich da ganz anders ran?
procedure TMyNewControl.Paint;
begin inherited TCustomControl.Paint; end; Um Fragen vorzubeugen, in TMyBaseControl.Paint steht natürlich mehr Code. Dank und gruß oki |
Re: inherited für Vorfahren-Methode aufrufen
Gar nicht. Du kannst nicht die Methode einer "Großmutter" einer Klasse aufrufen und dabei die seiner "Mutter" überspringen. Das würde auch nicht dem Konzept der Objektorientierung entsprechen.
Was du aber machen kannst, ist, dass du gar keine inherited-Methode aufrufst. |
Re: inherited für Vorfahren-Methode aufrufen
Jo, dass ist mal Pech. Dachte ich mir schon, war mir aber nicht sicher. Dann muß ich mir was anderes einfallen lassen.
Mach ich's halt so:
Delphi-Quellcode:
Dank und gruß oki
TMyBaseControl = class(TCustomControl)
private FfirstProperty : string; protected procedure Paint; override; procedure MyCustomDraw; virtual; end; TMyNewControl = class(TMyBaseControl) protected procedure MyCustomDraw; override; end; procedure TMyBaseControl.Paint; begin inherited Paint; MyCustomDraw; end; procedure TMyNewControl.MyCustomDraw; begin // hier alles neue ohne inherited end; [edit] Lücken aufgefüllt :mrgreen: [/edit] |
Re: inherited für Vorfahren-Methode aufrufen
Grrr roter Kasten!
Dann aber ohne inheritet in meiner Variante MyCustomDraw. Paint ohne inherited? Geht da dann nicht einiges schief? Gruß oki |
Re: inherited für Vorfahren-Methode aufrufen
Paint ohne inherited? Die ursprüngliche Implementation tut (siehe OH) gar nichts.
|
Re: inherited für Vorfahren-Methode aufrufen
Zitat:
|
Re: inherited für Vorfahren-Methode aufrufen
Es geht auch noch anders
Delphi-Quellcode:
Ist zwar ein Trick funktioniert aber.
type
TPaintMethod = procedure of object; procedure TObjectXYZ.Paint; var N: TPaintMethod; begin TMethod(N).Data := Self; TMethod(N).Code := @TWinControl.Paint; N; end; Gruß Hagen |
Re: inherited für Vorfahren-Methode aufrufen
Zitat:
Delphi-Quellcode:
type
TBaseControl = class(TCustomControl) protected procedure BasePaint; procedure Paint; override; end; TObjectXYZ = class(TBaseControl) protected procedure Paint; override; end; { TBaseControl } procedure TBaseControl.BasePaint; begin inherited Paint; end; procedure TBaseControl.Paint; begin BasePaint; {...} end; { TObjectXYZ } procedure TObjectXYZ.Paint; begin BasePaint; // TCustomControl.Paint aufrufen { neuer Code } end; |
Re: inherited für Vorfahren-Methode aufrufen
@uligerhardt:
Jo, aber TMyNewControl soll mehrere Eigenschaften von TMyBaseControl erben. Neben Paint, wie hier im Beispiel, weden aber einge Methoden anders behandelt. aus diesem Grund meine Frage in diese Richtung. @jbg: Jo, dass ist natürlich auch noch 'ne Variante. So zu sagen von hinten durch die Brust. :lol: (würde ich sagen) @Hagen: Den Trick mit TMethod kannte ich noch nicht. Da müsste sogar der Debugger sauber durchkommen oder? Aus dem Bauch raus würde ich diesen Weg aber nur im Notfall nehmen. Ich bin erstaunt wie viele mögliche Varianten so zusammenkommen. Herzlichen Dank und Gruß oki [edit] War kurz ausser Haus und hab gleich die Hälfte übersehen [/edit] |
Re: inherited für Vorfahren-Methode aufrufen
Wie gesagt: Wenn du das so willst, ist die OO-konforme Möglichkeit, eine weitere Oberklasse einzuführen, die von TCustomControl abgeleitet ist und alle Eigenschaften TMyBaseControl besitzt außer der Paint-Methode, und von dieser dann TMyBaseControl und TMyNewControl abzuleiten.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:40 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 by Thomas Breitkreuz