AGB  ·  Datenschutz  ·  Impressum  







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

inherited für Vorfahren-Methode aufrufen

Ein Thema von oki · begonnen am 9. Aug 2007 · letzter Beitrag vom 9. Aug 2007
Antwort Antwort
Seite 1 von 2  1 2      
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#1

inherited für Vorfahren-Methode aufrufen

  Alt 9. Aug 2007, 14:57
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
42
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: inherited für Vorfahren-Methode aufrufen

  Alt 9. Aug 2007, 15:13
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.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#3

Re: inherited für Vorfahren-Methode aufrufen

  Alt 9. Aug 2007, 15:20
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 [/edit]
42
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#4

Re: inherited für Vorfahren-Methode aufrufen

  Alt 9. Aug 2007, 15:22
Grrr roter Kasten!

Dann aber ohne inheritet in meiner Variante MyCustomDraw. Paint ohne inherited? Geht da dann nicht einiges schief?

Gruß oki
42
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: inherited für Vorfahren-Methode aufrufen

  Alt 9. Aug 2007, 15:56
Paint ohne inherited? Die ursprüngliche Implementation tut (siehe OH) gar nichts.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt
Online

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#6

Re: inherited für Vorfahren-Methode aufrufen

  Alt 9. Aug 2007, 16:33
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.
Uli Gerhardt
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#7

Re: inherited für Vorfahren-Methode aufrufen

  Alt 9. Aug 2007, 18:37
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
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#8

Re: inherited für Vorfahren-Methode aufrufen

  Alt 9. Aug 2007, 18:55
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;
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#9

Re: inherited für Vorfahren-Methode aufrufen

  Alt 9. Aug 2007, 19:15
@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. (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]
42
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: inherited für Vorfahren-Methode aufrufen

  Alt 9. Aug 2007, 20:11
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.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  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 15: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