我写了这个简单的代码:
type
TTestA = class
strict protected
a: integer;
public
f: integer;
constructor Create(x: Integer);
end;
type
TTestB = class(TTestA)
strict private
c: integer;
end;
Run Code Online (Sandbox Code Playgroud)
我使用,strict因为这些类与类在同一单元中TForm1.由于a受定义保护,它应该只能在子类中访问,但是为什么这段代码不起作用?
procedure TForm1.Button1Click(Sender: TObject);
var
K: TTestB;
begin
k := TTestB.Create(3);
value = k.a; //I cannot access a
end;
Run Code Online (Sandbox Code Playgroud)
此外,受保护可用于创建抽象类.在C++中,如果我将构造函数声明为protected,我就无法创建对象的实例,只能创建子类.德尔福能做到这一点吗?
我对变量和构造函数有同样的问题.
受保护的访问意味着" 可以在类和任何子类中访问 ".
这意味着,a在你的榜样将是在类中的方法访问TTestB但这并不延伸到消费者的实例TTestB(或TTestA).
TForm1中的代码是一个类的一部分,该类不是TTestA的子类.
换句话说,TForm1不会从TTestA继承,因此无法访问任何私有或受保护的成员k.
答案在你自己的问题中:
由于
a受定义保护,因此只能在子类中访问它
无论TForm1使用k类型的局部变量这一事实TTestB,由于TForm1它本身不是其子类TTestA,因此它无权访问该k.a成员. TTestB是一个子类TTestA,所以在内部它有权访问a.
这在Embarcadero的文档中有更详细的解释:
| 归档时间: |
|
| 查看次数: |
338 次 |
| 最近记录: |