Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Im Konstruktor virtuelle Methode aufrufen? (https://www.delphipraxis.net/78631-im-konstruktor-virtuelle-methode-aufrufen.html)

DGL-luke 8. Okt 2006 13:24


Im Konstruktor virtuelle Methode aufrufen?
 
Hallo,

funktioniert der folgende Quelltext?

Delphi-Quellcode:
initialization

type
  TAbstrakt = class
  public
    constructor Create;
    procedure VirtualInit; virtual; abstract;
  end;

  TKonkret = class
  public
    procedure VirtualInit; override;
  end;

implementation

constructor TAbstrakt.Create;
begin
  DoSomethingUseful;
  VirtualInit;
end;

procedure TKonkret.VirtualInit;
begin
  DoSomethingEleAsUseful;
end;
Dass TAbstrakt.Create mit einem abstrakten Error fehlschlägt, ist klar; wie sieht es mit TKonkret.Crete aus? Ich werd das jetzt natürlich ausprobieren, aber meine Klassen sind schon ziemlich dick, deswegen ist das Debuggen nicht mehr so leicht, wenn plötzlich aus heiterem Himmel irgendwo ein Abstrakter Error auftaucht...

Elvis 8. Okt 2006 13:27

Re: Im Konstruktor virtuelle Methode aufrufen?
 
Magst du AfterContruction nicht? ;)
Zitat:

Zitat von DGL-luke
ist das Debuggen nicht mehr so leicht, wenn plötzlich aus heiterem Himmel irgendwo ein Abstrakter Error auftaucht...

Du hast immernoch den call stack. ;)

DGL-luke 8. Okt 2006 13:38

Re: Im Konstruktor virtuelle Methode aufrufen?
 
AfterConstruction... aha. Mal sehen. War bis jetzt noch nicht in meinem aktiven Delphi-Wortschatz ;)

Allerdings hab ich schon sehr viel jetzt im Konstruktor liegen, das eben nach diesem "VirtualInit" passieren muss, das müsst ich dann auch alles verschieben. Also lieber wärs mir, so wies oben ist... geht das?

@Call Stack: Ja, aber nur mit MadExcept, und das darf ich für kommerzielle Arbeit nicht verwenden wegen fehlender Lizenz^^ Der Delphi Debugger ist da schon lange ausgestiegen, wo ich bin(DLL-Entwicklung).

Elvis 8. Okt 2006 13:45

Re: Im Konstruktor virtuelle Methode aufrufen?
 
Zitat:

Zitat von DGL-luke
AfterConstruction... aha. Mal sehen. War bis jetzt noch nicht in meinem aktiven Delphi-Wortschatz ;)

Oh, Oh... AfterContruction /BeforeDestruction finde ich eigentlich sehr elegant. Beides ist Code , der unabhängig von construtor/destructor aufgerufen wird.
konstruktoren benutze ich eigentlich nur zum Initialisieren von eldern. wenn ich das nicht muss, nehme ich gar keinen. Destruktoren überschreibe ich eigentlich nie...

Zitat:

Allerdings hab ich schon sehr viel jetzt im Konstruktor liegen, das eben nach diesem "VirtualInit" passieren muss, das müsst ich dann auch alles verschieben. Also lieber wärs mir, so wies oben ist... geht das?
Ja, das was du da als Konstruktor siehst ist ja nicht der Teil, der tatsächlich die Instanz anlegt sondern eine normale Instanzmethode, die nur eben mit ein bisschen Zauberei und Trallalla aufgerufen wird. Da die Instanz und ihre VMT alle schon beisammen sind, werden virtuelle Methoden ganz normal aufgelöst.

DGL-luke 8. Okt 2006 14:04

Re: Im Konstruktor virtuelle Methode aufrufen?
 
Ok, danke. Und AfterConstruction/BeforeDestruction werde ich jedenfalls in Zukunft benutzen. Der Ansatz "Im Konstruktor Felder nillen, rest in AfterConstruction" scheint mir sehr elegant.

Elvis 8. Okt 2006 14:12

Re: Im Konstruktor virtuelle Methode aufrufen?
 
Zitat:

Zitat von DGL-luke
Ok, danke. Und AfterConstruction/BeforeDestruction werde ich jedenfalls in Zukunft benutzen. Der Ansatz "Im Konstruktor Felder nillen, rest in AfterConstruction" scheint mir sehr elegant.

Öhm, was soll das denn bringen? NewInstance gibt dir doch bereits deine Instanz, gefüllt mit Nullen.
Mit Initialisieren meinte ich Parameter des Konstruktors, die benutzt werden um Felder zu initialisieren. ;)

DGL-luke 8. Okt 2006 14:21

Re: Im Konstruktor virtuelle Methode aufrufen?
 
aha... noch so etwas, das ich nicht wusste^^


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:04 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-2025 by Thomas Breitkreuz