Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi [Methoden überschreiben] +Parameter +erneut überschreiben (https://www.delphipraxis.net/86499-%5Bmethoden-ueberschreiben%5D-parameter-erneut-ueberschreiben.html)

Martin K 15. Feb 2007 03:42


[Methoden überschreiben] +Parameter +erneut überschreiben
 
Moin,

ich habe folgendes Problem:
1. ich leite von einer Klasse ab, nennen wir die abgeleitete Klasse mal Tclass1
2. ich will eine Methode (den Konstruktor) überschrieben, aber mit zusätzlichen Parametern
dazu verwende ich normalerweise die Direktive reintroduce
3. nun wird von Tclass1 erneut abgeleitet: Tclass2
4. in Tclass2 soll der Konstruktor wieder überschrieben werden (aber mit den selben Parametern wie in Tclass1)
dazu verwende ich normalerweise override, allerdings klappt das nicht mehr:
Zitat:

E2170 Eine nichtvirtuelle Methode kann nicht überschrieben werden
Okay, muss also ein virtual hinter den Konstruktor von Tclass1.
virtual klappt allerdings nicht zusammen mit reintroduce, also muss reintroduce wieder weg.
Steht also nur virtual dahinter, es kommt zur Warnmeldung:
Zitat:

W1010 Methode 'Create' verbirgt virtuelle Methode vom Basistyp 'TCustomControl'
Hier nochmal als Code:
Delphi-Quellcode:
type
  Tclass1 = class(TCustomControl)
  public
    constructor Create(AOwner: TComponent; Test: String); reintroduce;
  end;

  Tclass2 = class(Tclass1)
  public
    constructor Create(AOwner: TComponent; Test: String); override; // <-- klappt nicht!
  end;
Delphi-Quellcode:
type
  Tclass1 = class(TCustomControl)
  public
    constructor Create(AOwner: TComponent; Test: String); virtual; // <-- Warnmeldung
  end;

  Tclass2 = class(Tclass1)
  public
    constructor Create(AOwner: TComponent; Test: String); override;
  end;
Meine Frage:
Was müsste richtiger Weise hinter dem Konstruktor für eine Direktive stehen?
Oder soll ich die Warnmeldung einfach ignorieren?

Hansa 15. Feb 2007 04:12

Re: [Methoden überschreiben] +Parameter +erneut überschreibe
 
Und der Nächste, der das Rad neu erfinden will. :stupid: Wieso hantiert ihr nur dauernd rum mit dem Custom-Kram ? :shock: Was soll denn der Zweck des ganzen sein ? Eine Komponente "erfinden" , die es noch in keiner in etwa vergleichbaren Weise gibt, oder was ? So dass man tatsächlich bei TControl, also quasi beim Urknall ansetzen muss ? :mrgreen: Bei OOP gehts hauptsächlich um Vererbung und das wird kaum oder falsch genutzt. Genauso weng, wie "inherited". Man setzt die relevanten Felder vom Vorgänger durch den Aufruf von inherited . Ab da gehts dann weiter.

Guck mir den VCL-Source jetzt nicht an, weil das TControl.Create sicherlich keinen Parameter "Test : string" hat. Muss tatsächlich die Parameterliste einer Methode geändert werden, was man nach Möglichkeit vermeiden sollte, dann ist das mit "overload" zu bewerkstelligen. Reintroduce ist da ziemlich uninteressant.

TBx 15. Feb 2007 06:36

Re: [Methoden überschreiben] +Parameter +erneut überschreibe
 
Hallol Martin K!

Deklariere wie folgt:
Delphi-Quellcode:
  Tclass1 = class(TCustomControl)
  public
    constructor Create(AOwner: TComponent; Test: String); reintroduce; virtual;
  end;

  Tclass2 = class(Tclass1)
  public
    constructor Create(AOwner: TComponent; Test: String); override;
  end;
Zitat:

virtual klappt allerdings nicht zusammen mit reintroduce
doch, tut es. Du mußt es nur in der richtigen Reihenfolge machen.

Gruß

Martin K 15. Feb 2007 17:03

Re: [Methoden überschreiben] +Parameter +erneut überschreibe
 
Zitat:

Zitat von onlinekater
Zitat:

virtual klappt allerdings nicht zusammen mit reintroduce
doch, tut es. Du mußt es nur in der richtigen Reihenfolge machen.

Gruß

Danke, so klappt's :thumb:
Da hatte ich wohl die falsche Reihenfolge :wall:

@Hansa:
Ich will nur eine Komponente, die mir einfach ein Bild anzeigen kann, ähnlich wie TImage.
Sie soll allerdings auch den Fokus erhalten können, deshalb schien mir das Ableiten von TCustomControl genau richtig :wink:
Mit overload erhalte ich übrigens auch die oben genannte Warnmeldung.

Hansa 16. Feb 2007 01:29

Re: [Methoden überschreiben] +Parameter +erneut überschreibe
 
Zitat:

Zitat von Martin K
@Hansa:
...
Mit overload erhalte ich übrigens auch die oben genannte Warnmeldung.

Reintroduce ist nur dazu da, diese Warnmeldung zu unterdrücken. -> F1 Ansonsten ist es ohne Bedeutung. Wer viele Warnungen erhält, der macht aber auch IMHO irgendwas falsch. :mrgreen:


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