Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   DCC W1010: Ich verberge nichts, dennoch wird gemeckert (https://www.delphipraxis.net/156255-dcc-w1010-ich-verberge-nichts-dennoch-wird-gemeckert.html)

himitsu 25. Nov 2010 10:16

Delphi-Version: 2010

DCC W1010: Ich verberge nichts, dennoch wird gemeckert
 
Code:
[DCC Warnung] ...: W1010 Methode '...' verbirgt virtuelle Methode vom Basistyp '...'
[DCC Warning] ...: W1010 Method '...' hides virtual method of base type '...'

Delphi-Quellcode:
TSingleton = Class
  Constructor Create; Virtual;
End;

TDemoSingleton = Class(TSingleton)
  Constructor Create;                 Overload; Override;
  Constructor Create(Param: Integer); Overload;
End;
Das Konstrukt ist so gewollt.

Das neue Create ruft auch das aktuelle virtuelle Create auf.

Und verdeckt wird auch nichts, da sich ja die Parameter unterscheiden.
Wenn ich das parameterlose Create ohne override deklariert hätte, dann hätt ich diese Fehlermeldung ja akzeptiert.

Wie kann ich nun diese Fehlermeldung für genau diesen Fall abschalten?
Mir ist grade wieder das Delphi-Referenz durchsuchenreintroduce eingefallen. :oops:

Gut, aber dennoch die Frage:
Warum wird gemeckert, obwohl nichts verdeckt wird?




Und die Reihenfolge dieser Direktiven versteh' ich och nicht.
Wieso muß reintroduce vor overload angegeben werden und virtual/override nach overload? Diese reintroduce, virtual und override sind doch von der selben Art.
Und wieso kann man sich die Reihenfolge nicht aussuchen?

Stevie 26. Nov 2010 07:33

AW: DCC W1010: Ich verberge nichts, dennoch wird gemeckert
 
Die Methoden werden nicht im Kontext gesehen beim Kompilieren, sondern einzeln. Nimmst du den parameterlosen Konstruktor in TDemoSingleton weg, siehst du, warum er meckert. Weil der Konstruktor mit Parameter in TDemoSingleton in der Tat den parameterlosen Konstruktor in TSingleton verdeckt.

Reintroduce macht nix anderes als die Warnung, dass diese Methode eine andere verdeckt, zu unterdrücken. Daher ist es nicht von der gleichen Art, wie virtual und override.

himitsu 26. Nov 2010 10:21

AW: DCC W1010: Ich verberge nichts, dennoch wird gemeckert
 
Zitat:

Zitat von Stevie (Beitrag 1064199)
Die Methoden werden nicht im Kontext gesehen beim Kompilieren, sondern einzeln.

Nochwas, weswegen der Compiler so Einiges an Überholung bedarf.

Zitat:

Zitat von Stevie (Beitrag 1064199)
Nimmst du den parameterlosen Konstruktor in TDemoSingleton weg, siehst du, warum er meckert. Weil der Konstruktor mit Parameter in TDemoSingleton in der Tat den parameterlosen Konstruktor in TSingleton verdeckt.

Nein, da wird auch nichts verdeckt, da das parameter Create immernoch "sichtbar" ist.
Wenn ich beim neuen Parameterlosen der Override vergessen hätte oder Diesen ebenfalls als Virtual/Dynamic deklariert hätte, dann hätt ich's ja verstanden, weil's dann wirklich verdeckt wäre
und man denken könnte, daß neue Felder nicht ausreichend initialisiert würden, wenn man das originale Create aufruft.

Zitat:

Zitat von Stevie (Beitrag 1064199)
Reintroduce macht nix anderes als die Warnung, dass diese Methode eine andere verdeckt, zu unterdrücken. Daher ist es nicht von der gleichen Art, wie virtual und override.

Virtual, Dynamic steuern ob eine Methode überschreibbar ist
Overide überschreibt
und Reintroduce steuert die zugehörige Fehlermeldung (überschreiben zum Vorfahre).

Overload steuert aber das Überladen innerhalb der eigenen Klasse.

Ich rücke gern mal gleiche/ähnliche Dinge untereinander, damit es übersichtlicher wird.
Hier geht das nicht, Aufgrund der unterschiedlichen Reihenfolge.


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