Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi "Create" neu definieren (https://www.delphipraxis.net/30022-create-neu-definieren.html)

Pseudemys Nelsoni 18. Sep 2004 16:21


"Create" neu definieren
 
hi,

ich möchte das Create meiner vorgängerklasse (constructor Create(AOwner: TComponent); override) neu definieren, also mit mehreren parametern. Ca. so:

Delphi-Quellcode:
constructor Create(AOwner: TComponent; ServerName, ServerDesc: string);
nur gibt es da ein problem, override funktioniert nicht, da sich die parameter ja unterscheiden... ohne override kann ich aber auch kein inherited aufrufen oder? was kann ich da nun tun?

Dax 18. Sep 2004 16:36

Re: "Create" neu definieren
 
Du kannst inherited auch aufrufen, ohne deinen Konstruktor die override-Direktive zu verpassen, aber wenn du den Konstruktor deiner Vorgängerklasse neu defnieren willst, musst du eben diese neu schreiben.

JasonDX 18. Sep 2004 16:39

Re: "Create" neu definieren
 
folgendes dürfte funzen:
Delphi-Quellcode:
myClass = class(TObject)
protected
  constructor Create(AOwner: TObject); override;
public
  constructor Create(AOwner: TObject; Wasauchimmer: integer); overload;
end;

//...

constructor myClass.Create(AOwner: TObject);
begin
  inherited;
end;

constructor myClass.Create(AOwner: TObject; Wasauchimmer: integer);
begin
  Create(AOwner);
end;
obs das Create(AOwner: TObject); braucht, weiß ich nicht. Aber so gehste sicher, dass nur der neue constructor verwendet werden kann.

Habs aber nicht ausprobiert.

Vielleicht gehts aber auch ohne override ganz einfach mit dieser Zeile als aufruf für den alten constructor
Delphi-Quellcode:
begin
  inherited Create(AOwner);
end;

SirThornberry 18. Sep 2004 17:36

Re: "Create" neu definieren
 
der alte Constructor muss nicht unbedingt überschrieben werden, es reicht wenn im neuen wie schon geschrieben
Delphi-Quellcode:
  inherited Create(AOwner);
steht

Christian Seehase 18. Sep 2004 18:13

Re: "Create" neu definieren
 
Moin Chimaira,

Dein Beispiel kann leider nicht funktionieren, da Du die Sichtbarkeit des Konstruktors verringern willst.
(Ein Konstruktor dürfte wohl immer public sein)

Nothine 18. Sep 2004 18:52

Re: "Create" neu definieren
 
Zitat:

Zitat von Pseudemys Nelsoni
Delphi-Quellcode:
constructor Create(AOwner: TComponent; ServerName, ServerDesc: string); reintroduce;{<-- !!!}

mit reintroduce blockst du die meldung das du das vorgänger-create verdeckst, und du kannst weiterhin mit
Delphi-Quellcode:
inherited Create(AOwner);
im constructor den eigentlichen constructor der vorgänger-klasse aufrufen

Pseudemys Nelsoni 18. Sep 2004 19:23

Re: "Create" neu definieren
 
ich meinem buch steht, dass wenn man kein override benutzt der (in diesem fall) constructor neu definiert wird d.h der vorrige existiert nichtmehr, wie geht das dann mit inherited?

demnach wäre es ja garkein unterschied ob ich:

Delphi-Quellcode:
constructor Create(AOwner: TComponent; ServerName, ServerDesc: string); reintroduce
oder

Delphi-Quellcode:
constructor Create(AOwner: TComponent; ServerName, ServerDesc: string);
verwende... in beiden fällen dürfte das mit "inherited" nicht gehen oder(dazu gibts ja override...)?

Nothine 18. Sep 2004 20:34

Re: "Create" neu definieren
 
Zitat:

Zitat von Pseudemys Nelsoni
ich meinem buch steht, dass wenn man kein override benutzt der (in diesem fall) constructor neu definiert wird d.h der vorrige existiert nichtmehr, wie geht das dann mit inherited?

laut delphi-hilfe brauchst du die direktive overload damit du beim aufrufen des konstruktors deiner abgeleiteten klasse nicht den konstruktor der vorgänger-klasse aufrufst. denn ohne die direktiven overload oder reintroduce wird die vorgänger-methode lediglich verdeckt, ist aber immer noch verfügbar, dementsprechend würdest du die methode des vorgängers, und nicht die neue methode aufrufen, was ganz sicher nicht sinn und zweck der übung ist. da zum benutzen der overload-direktive aber die parameter identisch zur vorgänger-methode sein müssen, kann das nicht funktionieren, weshalb du die reintroduce-direktive benutzt, die zwar den eigentlichen konstructor nicht unerreichbar macht, aber die fehlermeldung, dass du die vorgänger-methode verdeckst, aufhebt.

und wenn ich jetz nich wieder blödsinn erzählt hab, nimm reintroduce und alles is gut :stupid: :wink:

Pseudemys Nelsoni 18. Sep 2004 22:17

Re: "Create" neu definieren
 
hoi,

ich möchte aber ausserhalb meiner klasse nicht 2 verschiedene "create" aufrufen können *g*

ich will 1 abgeändertes Create, mehr nicht, wie gehtn das :'(

maximov 18. Sep 2004 23:12

Re: "Create" neu definieren
 
Zitat:

Zitat von Pseudemys Nelsoni
hoi,

ich möchte aber ausserhalb meiner klasse nicht 2 verschiedene "create" aufrufen können *g*

ich will 1 abgeändertes Create, mehr nicht, wie gehtn das :'(

Das geht nicht! Ist ein OOP prinzip. Wenn du einmal was exportierst, dann muss es auch so bleiben, damit alle nachfahren kompatibel zu der basis klasse sind.

Und da stellt siche auch schon die nächste frage: Da es sich ja offensichtlich um eine komponente handelt, würde im normalen gebrauch (komponente im formular -> DFM streaming), so oder so der normale virtuelle konstruktor, der basisklasse (TComponent), aufgerufen werden. Also wozu soll der dienen? Wenn du ihn für manuelle erzeugung benutzt, dann bleibt dir nix weiter übrig als zwei überladene Konstruktoren zu haben, oder darauf zu verzichten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:58 Uhr.
Seite 1 von 2  1 2      

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