Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Frage zu overload + reintroduce (https://www.delphipraxis.net/177743-frage-zu-overload-reintroduce.html)

Der schöne Günther 25. Nov 2013 09:52

Delphi-Version: XE5

Frage zu overload + reintroduce
 
Eine Kindklasse möchte eine abstrakte Methode der Oberklasse implementieren und überladen. Beispiel:

Delphi-Quellcode:
   TBaseClass = class abstract
      procedure someProc(); virtual; abstract;
   end;

   TChildClass = class(TBaseClass)
      procedure someProc(); overload; override;
      procedure someProc(const someInput: Integer); overload; virtual;
   end;
Der Compiler meint:
Code:
Warnung: W1010 Methode 'someProc' verbirgt virtuelle Methode vom Basistyp 'TBaseClass'
Ich sehe nicht, wie da irgendetwas verborgen wird :gruebel:

Die Compilerwarnung geht weg wenn man entweder
  1. TBaseClass::someProc() die Direktive 'overload' hinzufügt
  2. TChildClass::someProc(Integer) die Direktive 'reintroduce' hinzufügt

Ersteres finde ich Quatsch. In der Oberklasse interessiert es mich herzlich wenig, ob in einer Kindklasse mal überladen wird. Außerdem würde ich mir so wahrscheinlich angewöhnen, grundsätzlich an jede Methode ein 'overload' anzuhängen.

Zweiteres ist logisch, laut Hilfe macht 'reintroduce' nichts anderes, als nur Compilerwarnungen zu unterdrücken. Aber wie gesagt: Ich sehe nicht, wie hier überhaupt etwas verdeckt wird...

baumina 25. Nov 2013 10:04

AW: Frage zu overload + reintroduce
 
In der Hilfe von meinem Delphi XE ist diese Compiler-Warnung ganz gut erklärt und 3 Dinge zum Vermeiden der Warnung angegeben.

himitsu 25. Nov 2013 10:10

AW: Frage zu overload + reintroduce
 
Nja, im Prinzip wird da vermutlich nur was falsch getestet (beim kompilieren des zweiten someProc wird das Erste nicht beachtet), aber das ist schon ewig so und läßt sich via reintroduce gut unterdrücken.

Der schöne Günther 25. Nov 2013 11:26

AW: Frage zu overload + reintroduce
 
Zitat:

Zitat von baumina (Beitrag 1237297)
In der Hilfe von meinem Delphi XE ist diese Compiler-Warnung ganz gut erklärt und 3 Dinge zum Vermeiden der Warnung angegeben.

Die drei Punkte sind
  1. [Passt nicht, da keine Überladung]
  2. "Dann Überladen sie halt nicht"
  3. "Verwenden Sie reintroduce um die Warnung zu unterdrücken"

Mein Punkt ist nur, dass hier nichts verdeckt wird und der Compiler mit seiner Warnung nicht Recht hat.

stahli 25. Nov 2013 11:32

AW: Frage zu overload + reintroduce
 
Mach Dir doch mal den QC-Spaß...

Sherlock 25. Nov 2013 12:36

AW: Frage zu overload + reintroduce
 
Zitat:

Zitat von stahli (Beitrag 1237319)
Mach Dir doch mal den QC-Spaß...

Ich bitte sogar darum!

Sherlock

Der schöne Günther 25. Nov 2013 15:15

AW: Frage zu overload + reintroduce
 
Kann ich gerne tun, ich wollte nur sicherstellen, dass hier kein Denkfehler drin ist und der Compiler mit seiner Warnung wirklich Unrecht hat.

Falls also noch jemand seine qualifizierte Meinung abgeben möchte ;-)

baumina 25. Nov 2013 15:33

AW: Frage zu overload + reintroduce
 
Gibt's wohl schon öfters, wie hier z.B. http://qc.embarcadero.com/wc/qcmain.aspx?d=106026

Der schöne Günther 25. Nov 2013 18:13

AW: Frage zu overload + reintroduce
 
"and u can see it in tests"

Etwas ungeschickt beschrieben aber ja, genau das ist es. Danke.

stahli 23. Mai 2014 21:39

AW: Frage zu overload + reintroduce
 
Vielleicht ist es schon zu spät heute ... oder verstehe ich die Fehlermeldung zu Recht nicht?

Create ist normal überschrieben.
Create(xxx) will ich virtuell erzeugen und überladen, damit ich es später bei Bedarf überschreiben kann.

Nach "overload; virtual;" wird "reintroduce;" jedoch nicht akzeptiert.
Wenn ich "reintroduce;" weg lasse funktioniert das Geraffel so.
Die unsinnige Fehlermeldung kann ich also nicht mal unterdrücken.


Oder liegt hier ein Denkfehler meinerseits vor?


Delphi-Quellcode:
  TTest = class(TBase)
  ...
  public
    RTState: Boolean;
    constructor Create; overload; override;
    constructor Create(aClassName: String); overload; virtual; reintroduce;
    destructor Destroy; override;

Zitat:

[dcc32 Warnung] soTypes.pas(104): W1010 Methode 'Create' verbirgt virtuelle Methode vom Basistyp 'TBase'
[dcc32 Fehler] soTypes.pas(104): E2169 Felddefinition nicht erlaubt nach Methoden oder Eigenschaften
[dcc32 Fehler] soTypes.pas(104): E2029 ',' oder ':' erwartet, aber ';' gefunden
[dcc32 Fehler] soTypes.pas(105): E2029 Typ erwartet, aber 'DESTRUCTOR' gefunden


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:44 Uhr.
Seite 1 von 2  1 2      

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