0

保護されたセクションで抽象メソッドが宣言されている抽象クラスがあります。その子でこのメソッドをプライベートとして再定義できますか?

論理的に見えます-抽象クラスでは、このメソッドは子(および子のみ)が使用できるように保護されます。しかし、子では、このメソッドはプライベートにすることができ、(メソッド)はこのクラスのオブジェクトの外部を呼び出しません。

できますか?

4

1 に答える 1

1

あなたは確かにそれを行うことができます。

type
  TMyAbstractBase = class
  protected
    procedure Foo; virtual; abstract;
  public
    procedure DoFoo;
  end;

  TMyDerived = class(TMyAbstractBase)
  private
    procedure Foo; override;
  end;

procedure TMyAbstractBase.DoFoo;
begin
  Foo;
end;

procedure TMyDerived.Foo;
begin
  Writeln('TMyDerived.Foo');
end;

その場合、もちろん別のユニットにある次のコードはコンパイルされません。

var
  obj: TMyDerived;
....
obj.Foo;//[dcc32 Error]: E2361 Cannot access private symbol TMyDerived.Foo

ただし、これを行うのは良い考えではありません。ここで、このクラスを考えてみましょう。これも別のユニットで宣言されています。

type
  TMyDerived2 = class(TMyDerived)
  public
    procedure Foo; override;
  end;

procedure TMyDerived2.Foo;
begin
  inherited;//this does nothing
  Writeln('TMyDerived2.Foo');
end;

実行された場合TMyDerived2.Fooinheritedステートメントは何もしません。それTMyDerived.Fooはプライベートだからです。

ですから、私のアドバイスは、あなたが提案することは可能ですが、あなたはそれをしないということです。経験則として、メンバーの可視性を低下させないようにする必要があります。

于 2013-02-26T14:27:00.337 に答える