如何隐藏对象的受保护过程?

时间:2012-02-22 17:48:09

标签: delphi object override delphi-xe2 access-levels

在一个基类中,有一个受保护的过程。继承该类时,我希望隐藏该程序,使其不被外部使用。我尝试从私有甚至严格的私有部分覆盖它,但它仍然可以从外部调用。原始类不是我的,所以我无法改变TOriginal的定义方式。

是否可以在我继承的类中隐藏此过程?怎么样?

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

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

2 个答案:

答案 0 :(得分:11)

受保护的方法已经从外部隐藏。 (主要是;见下文。)您无法降低类成员的可见性。如果基类声明方法受保护,那么该类的所有后代都可以使用该方法。


在Delphi中,与类相同的单元内的其他代码可以访问该类的受保护成员,甚至是来自不相关类的代码。这有时很有用,但通常可以解决其他设计缺陷。如果你有“真的,真的”应该受到保护的东西,你可以使它严格受保护,然后特殊的同一单元访问规则不适用。

答案 1 :(得分: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