7

1 つの基本クラスには、保護されたプロシージャがあります。そのクラスを継承する際に、その手続きを外部から使われないようにしたい。privateおよびstrict privateセクション内からオーバーライドしようとしましたが、それでも外部から呼び出すことができます。元のクラスは私のものではないため、 のTOriginal定義方法を変更することはできません。

継承したクラスでこの手順を非表示にすることはできますか? そしてどうやって?

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

  TNew = class(TOriginal)
  strict private
    procedure SomeProc; override;
  end;
4

2 に答える 2

11

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


Delphi では、クラスと同じユニット内の他のコードが、関連のないクラスのコードであっても、そのクラスの保護されたメンバーにアクセスできます。これは便利な場合もありますが、通常は他の設計上の欠陥を回避するために使用されます。「本当に、本当に」保護されるべきものがある場合は、それを厳密に保護することができます。そうすれば、特別な同一ユニット アクセス ルールは適用されません。

于 2012-02-22T18:16:01.050 に答える
1

露出すると非表示にすることはできませんが、これを行うと、制限された方法で呼び出された場所を見つけることができます

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
于 2012-02-22T22:14:29.887 に答える