保護されたセクションで抽象メソッドが宣言されている抽象クラスがあります。その子でこのメソッドをプライベートとして再定義できますか?
論理的に見えます-抽象クラスでは、このメソッドは子(および子のみ)が使用できるように保護されます。しかし、子では、このメソッドはプライベートにすることができ、(メソッド)はこのクラスのオブジェクトの外部を呼び出しません。
できますか?
あなたは確かにそれを行うことができます。
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.Foo
、inherited
ステートメントは何もしません。それTMyDerived.Foo
はプライベートだからです。
ですから、私のアドバイスは、あなたが提案することは可能ですが、あなたはそれをしないということです。経験則として、メンバーの可視性を低下させないようにする必要があります。