Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi inherited für Vorfahren-Methode aufrufen (https://www.delphipraxis.net/97376-inherited-fuer-vorfahren-methode-aufrufen.html)

oki 9. Aug 2007 13:57


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:
  TMyBaseControl = class(TCustomControl)
  private
    FfirstProperty : string;
  protected
    procedure Paint; override;
  end;


  TMyNewControl = class(TMyBaseControl)
  protected
    procedure Paint; override;
  end;
Jetzt soll in MyNewControl per inherited aber die Methode Paint aus TCustomControl aufgerufen werden. Schreibe ich es so:
Delphi-Quellcode:
procedure TMyNewControl.Paint;
begin
  inherited Paint;
end;
wird ja der Code aus MyBaseControl.Paint aufgerufen. Wie ist der Aufruf aber für Paint des TCustomControl?

so?
Delphi-Quellcode:
procedure TMyNewControl.Paint;
begin
  inherited TCustomControl.Paint;
end;
oder muß ich da ganz anders ran?

Um Fragen vorzubeugen, in TMyBaseControl.Paint steht natürlich mehr Code.

Dank und gruß oki

3_of_8 9. Aug 2007 14:13

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.

oki 9. Aug 2007 14:20

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:
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;
Dank und gruß oki

[edit] Lücken aufgefüllt :mrgreen: [/edit]

oki 9. Aug 2007 14:22

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

3_of_8 9. Aug 2007 14:56

Re: inherited für Vorfahren-Methode aufrufen
 
Paint ohne inherited? Die ursprüngliche Implementation tut (siehe OH) gar nichts.

uligerhardt 9. Aug 2007 15:33

Re: inherited für Vorfahren-Methode aufrufen
 
Zitat:

Zitat von oki
Mach ich's halt so:
Delphi-Quellcode:
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;

Oder leite TMyNewControl nicht von TMyBaseControl ab, sondern führe eine neue Basisklasse für beide ein, die ein "leeres" Paint enthält, sonst aber das gleiche leistet wie dein bisheriges TMyBaseControl.

negaH 9. Aug 2007 17:37

Re: inherited für Vorfahren-Methode aufrufen
 
Es geht auch noch anders

Delphi-Quellcode:
type
  TPaintMethod = procedure of object;

procedure TObjectXYZ.Paint;
var
  N: TPaintMethod;
begin
  TMethod(N).Data := Self;
  TMethod(N).Code := @TWinControl.Paint;
  N;
end;
Ist zwar ein Trick funktioniert aber.

Gruß Hagen

jbg 9. Aug 2007 17:55

Re: inherited für Vorfahren-Methode aufrufen
 
Zitat:

Zitat von negaH
Es geht auch noch anders

Dann doch lieber so:
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;

oki 9. Aug 2007 18:15

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]

3_of_8 9. Aug 2007 19:11

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 15:05 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