W1010 Methode '%s' verbirgt virtuelle Methode vom Basistyp '%s' (Delphi)

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Fehler- und Warnungsmeldungen (Delphi)


Sie haben eine Methode deklariert, die dieselbe Bezeichnung wie eine virtuelle Methode in der Basisklasse hat. Diese neue Methode ist keine virtuelle Methode und verbirgt den Zugriff auf die gleichnamige Basismethode.

program Produce;
 
 type
   Base = class(TObject)
     procedure VirtuMethod; virtual;
     procedure VirtuMethod2; virtual;
     procedure VirtuMethod3; virtual;
   end;
 
   Derived = class(Base)
     procedure VirtuMethod;
     procedure VirtuMethod2;
     procedure VirtuMethod3;
   end;
  
 procedure Base.VirtuMethod;
 begin
 
 end;
  
 procedure Base.VirtuMethod2;
 begin
 
 end;
 
 procedure Base.VirtuMethod3;
 begin
 
 end;
 
 procedure Derived.VirtuMethod;
 begin
 
 end;
  
 procedure Derived.VirtuMethod2;
 begin
 
 end;
 
 procedure Derived.VirtuMethod3;
 begin
 
 end;
 
 begin
 
 end.

Beide in der Definition von Derived deklarierten Methoden verbergen die gleichnamigen virtuellen Funktionen in der Klasse Base.

Es gibt drei Möglichkeiten, um diesen Fehler zu beheben.

  1. Sie können override angeben, um die Prozedur der abgeleiteten Klasse ebenfalls als virtuell festzulegen, wenn die entsprechende Methode des Vorfahren als virtual oder dynamic deklariert ist, sodass geerbte Aufrufe sich immer noch auf die ursprüngliche Prozedur beziehen können.
  2. Sie können den Namen der Prozedur in der Deklaration der abgeleiteten Klasse ändern.
    Beide Methoden sind in den obigen Quellcodefragmenten enthalten.
  3. Sie können die Direktive reintroduce in die Deklaration der Prozedur einfügen, um die Warnung für diese Methode zu unterdrücken. Durch das Schlüsselwort reintroduce wird der Delphi-Compiler angewiesen, die entsprechende Methode zu verbergen und die Warnung zu unterdrücken, weil das Überschreiben einer gleichnamigen Methode in einer nicht als virtual oder dynamic deklarierten Basisklasse unwahrscheinlich ist.


program Solve;
  
 type
   Base = class(TObject)
     procedure VirtuMethod; virtual;
     procedure VirtuMethod2; virtual;
     procedure VirtuMethod3; virtual;
   end;
  
   Derived = class(Base)
     procedure VirtuMethod; override;
     procedure Virtu2Method;
     procedure VirtuMethod3; reintroduce;
   end;
  
 procedure Base.VirtuMethod;
 begin
 
 end;
  
 procedure Base.VirtuMethod2;
 begin
 
 end;
 
 procedure Base.VirtuMethod3;
 begin
 
 end;
  
 procedure Derived.VirtuMethod;
 begin
 
 end;
  
 procedure Derived.Virtu2Method;
 begin
 
 end;
 
 procedure Derived.VirtuMethod3;
 begin
 
 end;
  
 begin
 
 end.

Siehe auch