Einzelnen Beitrag anzeigen

Rollo62

Registriert seit: 15. Mär 2007
3.917 Beiträge
 
Delphi 12 Athens
 
#1

TObject.GetHashCode hides virtual method of base type TObject

  Alt 3. Feb 2016, 16:28
Delphi-Version: 10 Seattle
Hallo zusammen,

ich bin gerade beim Frühjrahrsputz, und natürlich finde ich wieder ein Thema was erst einfach aussieht,
aber wo man sich immer tiefer reinwurschteln muss.

Ich habe die PegTopCommon library für ein Projekt ausprobiert, von der ich nur einen kleinen Teilbereich bräuchte.

Beim Kompilieren habe ich aber immer die unschöne Warnung s.o.

Ich habe (einen) der Verursacher unten mal rausextrahiert, und separat getestet.

Das Problem ist wohl Folgendes:
- jede Klasse ist von TObject abgeleitet
- TObject enthält eine virtuelle GetHashCode Funktion
- Die PegTop Klassen machen genau das wie oben, und benutzt dämlicherweise den speziellen Namen der Funktion mit
anderer Signatur

Interessant zu dem Thema auch;
http://www.delphi-treff.de/object-pascal/vererbung/
http://blog.marcocantu.com/blog/6hidden_delphi2009.html
http://codebetter.com/davidhayden/20...alsobject-obj/
http://docwiki.embarcadero.com/Libra...ct.GetHashCode


Meine Frage ist wie sollte man mit so einer Situation umgehen, kann man das per overload erledigen (so einfach in dem Fall jedenfalls nicht).
Die grosse Frage ist aber sollte man das overloaden, immerhin ist das ja fast wie ein Keyword zu sehen, und wer weiss
was sich im Weiteren Objektleben so daran stört.
Einfach ignorieren ist für mich auch keine Lösung, solche Warnings will ich nicht im Code sehen.

Ich werde PegTop wohl rausschmeissen, anyway, aber noch habe ich den Code im Test Laufen und vielleicht gibt es doch das eine oder andere wo PegTop sich lohnt.
Interessieren würde mich schon was die sich dabei gedacht haben und wie man das evtl. fixen kann.


Delphi-Quellcode:
unit Unit1;

interface

uses
   System.Classes
  ;


type
  TPegtopAbstractHash = class
  protected
  public
    constructor Create(InitialCapacity: Integer = 100); virtual;
  end;

  TPegtopIntHash = class(TPegtopAbstractHash)
  private

    // Hier kommt Warning
    // hides virtual method of base type TObject
    function GetHashCode(Key: Integer): Integer;


  public
    constructor Create(InitialCapacity: Integer = 100); override;
    destructor Destroy; override;
  end;




implementation

{ TPegtopAbstractHash }

constructor TPegtopAbstractHash.Create(InitialCapacity: Integer);
begin


end;

function TPegtopIntHash.GetHashCode(Key: Integer): Integer;
begin
  Result := 0;
end;


constructor TPegtopIntHash.Create(InitialCapacity: Integer);
begin
   inherited Create( InitialCapacity );
end;

destructor TPegtopIntHash.Destroy;
begin

end;


end.
  Mit Zitat antworten Zitat