オブジェクトの保護された手順を非表示にする方法は?
-
29-10-2019 - |
質問
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
所属していません StackOverflow