x2269: オーバーライドされた仮想メソッド '%s.%s' の可視性が %s となり基本クラス '%s' での可視性 (%s) より低くなりました (Delphi)

提供: RAD Studio
移動先: 案内検索

エラーと警告のメッセージ(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 つあります。

  1. ヒントを無視する
  2. 基本クラスに合わせて可視性を変更する
  3. クラス定義を実装部に移動する

上記の例では,可視性を基本クラスに合わせて変更しています。