我正在
无法访问受保护的符号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
当然是有效的。
答案 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
是在不同的单位中定义的,Unit1
,c.Test.Test
无法编译。同样,此代码无法在Unit2
中编译:
var
p: TParent;
....
p.Test;