x2269: オーバーライドされた仮想メソッド '%s.%s' の可視性が %s となり基本クラス '%s' での可視性 (%s) より低くなりました (Delphi)
エラーと警告のメッセージ(Delphi) への移動
メッセージに表示されたメソッドが,基本クラスの仮想メソッドをオーバーライドして宣言されましたが,そのメソッドに対して基本クラスで使用されている可視性よりも現在のクラスの可視性の方が低くなっている場合にこのヒントが表示されます。
Delphi の可視性に関する規則では関数は見えないことを意味するように思えますが,仮想関数の呼び出し規約では,仮想呼び出しによって関数は適切に呼び出されます。
このメッセージは通常,基本クラスのメソッドが protected または pubic 部(published を含む)で宣言されたのに対して,派生クラスのメソッドが private または protected 部で宣言されたことを意味します。
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.
{ 上記の例は,Extended.VirtualProcedure を protected 部に入れることでこのエラーが発生することを示している }
{ これは実際には問題にはならないが,ドキュメントに書かれた可視性属性と違うので混乱を招く恐れがある }
{ このヒントは,ユニットの interface 部のクラスに対してのみ生成される }
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.
この問題の基本的な解決方法は 3 つあります。
- ヒントを無視する
- 基本クラスに合わせて可視性を変更する
- クラス定義を実装部に移動する
上記の例では,可視性を基本クラスに合わせて変更しています。