質問

1つのベースクラスには、aがあります 保護されています 手順。そのクラスを継承するとき、私はその手順を外から使用することから隠したいと思います。私はそれを内側からオーバーライドしようとしました プライベート そしてさえ 厳格なプライベート セクションですが、それでも外から呼び出すことができます。元のクラスは私のものではないので、私はどのように変えることができません TOriginal 定義されています。

私の継承されたクラスでこの手順を隠すことは可能ですか?そしてどうやって?

type
  TOriginal = class(TObject)
  protected
    procedure SomeProc;
  end;

  TNew = class(TOriginal)
  strict private
    procedure SomeProc; override;
  end;
役に立ちましたか?

解決

保護された方法はです すでに 外から隠されています。 (主に;以下を参照してください。)クラスメンバーの可視性を減らすことはできません。基本クラスが保護された方法を宣言した場合、そのクラスのすべての子孫がメソッドを使用する場合があります。


Delphiでは、クラスと同じユニット内の他のコードが、無関係なクラスのコードでさえ、そのクラスの保護されたメンバーにアクセスすることができます。それは時々有用ですが、通常は他のデザインの欠陥を回避するためです。あなたが「本当に、本当に」保護されるはずの何かを持っているなら、あなたはそれを作ることができます 厳しい 保護された後、特別な同性アクセスルールは適用されません。

他のヒント

露出したら、それを隠すことはできませんが、これを行うには、リミットウェイで呼び出される場所を見つけることができます

TOriginalClass = class
public
  procedure Foo;
end;

TNewClass = class(TOriginalClass) 
public
  procedure Foo; reintroduce;
end;

implementation

procedure TNewClass.Foo;
begin
  Assert(False, 'Do not call Foo from this class');
  inherited Foo;
end;

var Obj: TNewClass;
Obj := TNewClass.Create;
Obj.Foo; // get assert message

Will not get Assert error if declared as TOriginalClass
var Obj: TOriginalClass;
Obj := TNewClass.Create;
Obj.Foo; // Never get the assert message
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top