Delphi保护变量和构造函数

Raf*_*ssi 1 delphi

我写了这个简单的代码:

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,我就无法创建对象的实例,只能创建子类.德尔福能做到这一点吗?

我对变量和构造函数有同样的问题.

Del*_*ics 7

受保护的访问意味着" 可以在类和任何子类中访问 ".

这意味着,a在你的榜样将是在类中的方法访问TTestB但这并不延伸到消费者的实例TTestB(或TTestA).

TForm1中的代码是一个类的一部分,该类不是TTestA的子类.

换句话说,TForm1不会从TTestA继承,因此无法访问任何私有受保护的成员k.


Rem*_*eau 5

答案在你自己的问题中:

由于a受定义保护,因此只能在子类中访问它

无论TForm1使用k类型的局部变量这一事实TTestB,由于TForm1它本身不是其子类TTestA,因此它无权访问该k.a成员. TTestB是一个子类TTestA,所以在内部它有权访问a.

这在Embarcadero的文档中有更详细的解释:

类和对象(Delphi):类成员的可见性