7

在一个基类中,有一个受保护的过程。继承该类时,我想隐藏该过程以免被外部使用。我尝试从私有甚至严格的私有部分中覆盖它,但仍然可以从外部调用它。Original 类不是我的,所以我无法更改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 回答