x2269: Durch das Überschreiben erhält die virtuelle Methode '%s.%s' eine geringere Sichtbarkeit (%s) als die Basisklasse '%s' (%s) (Delphi)
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:
- Den Hinweis ignorieren.
- Die Sichtbarkeit in der abgeleiteten Klasse so ändern, dass sie der Sichtbarkeit in der Basisklasse entspricht.
- Die Klassendefinition in den Implementierungsabschnitt verschieben.
Im Beispiel wurde die Sichtbarkeit der Methode an die Sichtbarkeit in der Basisklasse angepasst.