Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - DAs Überschreiben von Constructor funzt nicht :-(


catweasel - Fr 14.11.03 23:36
Titel: DAs Überschreiben von Constructor funzt nicht :-(
Hi,

Hab da ein OOP Problem: Ich deklariere eine Klasse (etwas vereinfacht):

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
type
  test = class(TWincontrol)
  constrctor create (AOwner: TComponent; xalign,yalign : integer);override;

{...}

constrctor create (AOwner: TComponent; xalign,yalign : integer);
begin
  left := xalign;
  top := yalign;
  {...}
end;

Was ich also machen möchte ist folgendes: Ich möchte ein Objekt vom Typ TWincontrol mit einem neuen Konstruktor ausstatten, weil ich diesem Objekt ein paar Werte beim createn mitgeben will. Nämlich die Position an der es erscheinen soll.

Nun bekomme ich die Fehlermeldung:
Zitat:
"Create differs from previous declaration"

Hmmm, na gut. Das ist wohl tatsächlich der Fall, denn in dem Ursprünglichen Konstruktor von create sind ja keine Parameter xalign, oder yalign vorhanden. Soweit ist das für mich noch nachvollziehbar. ABER: In der Ursprünglichen Deklaration von TWincontrol ist der Constructor create als virtual vereinbart.

Warum darf ich ihn trotzdem nicht überschreiben? Oder anders gefragt: Was muss ich machen um einem bestehendem Konstruktor Parameter hinzuzufügen?

Hoffe hab die Frage nich zu doof ausgedrückt...

Catweasel

Moderiert von user profile iconTino: Delphi-& Quote-Tags hinzugefügt


UC-Chewie - Fr 14.11.03 23:46

Bei nem Konstruktor braucht du override nicht anzugeben.


ErnestoChe - Sa 15.11.03 00:26

Hi,

wenn du eine virtuelle Methode bzw. einen virtuellen Konstruktor überschreibst muss die Parameterliste mit der der Vorfahrklasse übereinstimmen.

Wenn du die Parameterliste erweitern willst musst du ganz einfach einen neuen Konstruktor festlegen ohne die direktive override. Du kannst den Konstruktor auch beliebig benennen. Du kannst dann in diesem Konstruktor immer noch den Konstruktor Create vom Vorfahren aufrufen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
constructor test.Create(AOwner: TComponent; xalign, yalign: integer);
begin
  inherited Create(AOwner)

  //........
end;


MFG

- Ernesto -


catweasel - Sa 15.11.03 01:01

DAnke für den Tipp :D

Catweasel


barfuesser - Mo 17.11.03 09:46

Falls Du den Konstruktor genau so wie in der Vorfahrklasse benennen möchtest, empfiehlt es sich die Direktive reintroduce zu verwenden, da ansonsten immer lästige Hinweise angezeigt werden.

barfuesser