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。
假设我们有一个 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。