x2269: Durch das Überschreiben erhält die virtuelle Methode '%s.%s' eine geringere Sichtbarkeit (%s) als die Basisklasse '%s' (%s) (Delphi)

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Fehler- und Warnungsmeldungen (Delphi)


Der in der Fehlermeldung genannte Methode wurde als Überschreibung einer virtuellen Methode in einer Basisklasse deklariert, aber die Sichtbarkeit in der aktuellen Klasse ist geringer als diejenige, die für die Basisklasse der gleichen Methode festgelegt wurde.

Obwohl die Sichtbarkeitsregeln von Delphi anscheinend angeben, dass die Funktion niemals sichtbar ist, bewirken die Regeln zum Aufrufen von virtuellen Funktionen, dass die Funktion durch einen virtuellen Aufruf korrekt aufgerufen wird.

In der Regel tritt dieser Fehler auf, wenn eine Methode in einem als private oder protected deklarierten Abschnitt der abgeleiteten Klasse deklariert wird, aber in einem als protected oder public/published deklarierten Abschnitt in der Basisklasse auftaucht.


unit Produce;
interface

  type
    Base = class(TObject)
    public
      procedure VirtualProcedure(X: Integer); virtual;
    end;

    Extended = class (Base)
    protected
      procedure VirtualProcedure(X: Integer); override;
    end;

implementation

  procedure Base.VirtualProcedure(X: Integer);
  begin
  end;

  procedure Extended.VirtualProcedure(X: Integer);
  begin
  end;
end.


Das Beispiel zeigt, wie dieses Problem durch das Einfügen von Extended.VirtualProcedure in den als protected deklarierten Abschnitt entsteht.

In der Praxis ist dies zwar nie schädlich, aber es kann jemanden verwirren, der die Dokumentation liest die Sichtbarkeitsattribute betrachtet.

Dieser Hinweis wird nur für Klassen produziert, die in dem interface-Abschnitt einer Unit enthalten sind.


unit Solve;
interface

  type
    Base = class(TObject)
    public
      procedure VirtualProcedure(X: Integer); virtual;
    end;

    Extended = class (Base)
    public
      procedure VirtualProcedure(X: Integer); override;
    end;

implementation

  procedure Base.VirtualProcedure(X: Integer);
  begin
  end;

  procedure Extended.VirtualProcedure(X: Integer);
  begin
  end;
end.


Es gibt für dieses Problem drei Lösungsmöglichkeiten:

  1. Den Hinweis ignorieren.
  2. Die Sichtbarkeit in der abgeleiteten Klasse so ändern, dass sie der Sichtbarkeit in der Basisklasse entspricht.
  3. Die Klassendefinition in den Implementierungsabschnitt verschieben.

Im Beispiel wurde die Sichtbarkeit der Methode an die Sichtbarkeit in der Basisklasse angepasst.