Delphi 中的继承:是否每个 Delphi 子类都有自己唯一的超类私有字段副本?

Inheritance in Delphi : Does each of Delphi Subclasses have its own unique copy of the Superclass Private Fields?

假设我们有一个 Delphi 超类 (TSuper) 并且我们从它继承了一组 Sub类 ( TSub1 , TSub2 )。 此超类 (TSuper) 只有一个私有字段 ( FField )。

Sub类 ( TSub1, TSub2 ) 根本没有具体的真实字段,如下面的代码所示(这是为了测试!),而是继承了其祖先的私有字段。

unit Unit1;

interface

uses
  Winapi.Windows,
  Winapi.Messages,
  System.SysUtils,
  System.Variants,
  System.Classes,
  Vcl.Graphics,
  Vcl.Controls,
  Vcl.Forms,
  Vcl.Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

Type
  TSuper = class
  private
    FField: integer;
  public
    constructor Create;
    Property Int: integer read FField write FField;
  end;

  TSubOne = class(TSuper)
  public
    constructor Create;
  end;

  TSubTwo = class(TSuper)
  public
    constructor Create;
  end;

var
  Form1: TForm1;
  vSuper: TSuper;
  vOne: TSubOne;
  vTwo: TSubTwo;

implementation

{$R *.dfm}
{ TSuper }

constructor TSuper.Create;
begin
  self.FField := 0;
end;

{ TSub }

constructor TSubOne.Create;
begin
  self.FField := 1;
end;

{ TSubTwo }

constructor TSubTwo.Create;
begin
  self.FField := 2;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  vSuper := TSuper.Create;
  vOne := TSubOne.Create;
  vTwo := TSubTwo.Create;

  ShowMessage('Field of Super Class = ' + inttostr(vSuper.Int));
  ShowMessage('Field of Sub Class One = ' + inttostr(vOne.Int));
  ShowMessage('Field of Sub Class Two = ' + inttostr(vTwo.Int));
end;

end.

当我们 运行 上面的代码时,我们注意到如果我们为 3 个 类 字段(TSuper、TSub1 和 TSub2)中的每一个分配不同的值,它们将 return 每个的正确值。

由此看来,Delphi 将在其每个子类.

中创建超类私有字段的隐藏的、唯一的(不同的)副本

这是正确的吗?我们真的可以依赖这个功能吗?或者它只是理想情况下的临时功能,在任何情况下都会有不同的工作方式!

我在哪里可以找到文档中对此行为的解释?

谢谢。

Does each of Delphi Subclasses have its own unique copy of the Superclass Private Fields?

是的,子class的每个对象实例都有自己的一组在整个class层次结构中定义的所有字段。

如果您需要 class 的所有实例通用的数据,您需要使用关键字 class 将其定义为 class 属性。

有关详细信息,请查看 Delphi documentation