无法访问受保护的符号?

时间:2017-12-04 15:30:47

标签: delphi delphi-xe2 protected

我正在

  

无法访问受保护的符号TParent.Test

代码如下:

在Unit1中:

TParent = class
protected
  function Test: TParent;
end;

implementation

function TParent.Test: TParent;
begin
  Result := Self
end;

在第2单元:

uses Unit1;

type

TChild = class(TParent)
end;

implementation

var c: TChild;
begin
  c := TChild.Create;
  c.Test.Test
end;

TChild是不是可以访问返回值?

c.Test;
c.Test

当然是有效的。

2 个答案:

答案 0 :(得分:6)

TChild可以访问返回值 ,但您要做的是通过TChild中的TParent访问它,这是微妙的不同。

这样想。

c.Test是一个TParent,是吗?

现在想象你有一个像这样定义的TParent

var 
  c: TChild;
  p: TParent
begin
  c := TChild.Create;
  p := c.Test;
  p.Test;
end;

这完全等同于您的代码。应该能够访问测试吗?不,因为它受到保护(并且在不同的单元中)。

答案 1 :(得分:4)

var 
  c: TChild;
....
c.Test.Test;

方法TParent.Test受到保护,这意味着它可以通过TParent方法和从TParent派生的类方法访问。此外,在调用引用时可以访问它,该引用的类与调用代码在同一单元中定义。

documentation这样说,我强调:

  

受保护的成员在模块中的任何地方都可以看到,其类声明为,并且可以从任何后代类看到,无论后代类出现的模块如何。

在您访问受保护成员的单元中声明TChild这一事实是理解这一点的关键。

在您的示例代码中,Unit2撰写c.Test时,对Test的调用不是来自TParent的方法或来自它的类。但是它是在TChild类型的变量上创建的,它在Unit2中声明,这是调用方法的单位。所以它是可见的。

但是,c.Test的类型为TParent。由于TParent是在不同的单位中定义的,Unit1c.Test.Test无法编译。同样,此代码无法在Unit2中编译:

var
  p: TParent;
....
p.Test;