Delphi-PRAXiS

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 15: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 15: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 15: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 16: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 17: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 17: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 18: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 19: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 21: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 22: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.

Pseudemys Nelsoni 19. Sep 2004 17:44

Re: "Create" neu definieren
 
ich muss schon innerhalb des creates 2 strings übergeben!
Deswegen muss ich das Create überschreiben, mit verschiedenen parametern...
es muss doch gehen... TIniFile hat auch ein abgeändertes Create! also muss ich das doch auch schaffen können...natürlich dürfen da nachher keine 2 creates existieren...

maximov 19. Sep 2004 18:38

Re: "Create" neu definieren
 
TIniFile ist auch keine komponente.

Ich bin mir nicht sicher ob du das komponenten modell verstanden hast, denn wenn du in dem konstruktor einer komponente unneutrale daten brauchst, dann hasst du verloren oder den design ist fehlerhaft.

Beschreib mal genau was du vor hasst, denn meist sieht man den richtigen weg nicht sofort und wir können dann als wegweiser dienen :cyclops:

Pseudemys Nelsoni 19. Sep 2004 18:41

Re: "Create" neu definieren
 
also, meine Klasse (abgeleitet von TCustomServerSocket) soll bereits im create eine datei öffnen, den pfad zur datei muss ich dem create ja mitgeben damit es die datei öffnen kann :\

maximov 19. Sep 2004 20:59

Re: "Create" neu definieren
 
und warum muss es die datei von anfang an kennen, würde es nicht reichen, wenn du eine property machst und beim setzen dieser die datei geöffnet wird? und dann ein interner status auf 'active' gesetzt wird, der den restlichen operationen sagt, das sie auf der datei arbeiten könenn. Dann wäre es kein problem das als normale komponente zu benutzen.

Wozu soll die datei gut sein? Ab welchem zeitpunkt wird sie wirklich gebraucht? ...dir muss man echt alles aus der nase ziehen :stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:39 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