Delphi 构造函数和类构造函数

ercv8c1e  于 2022-11-23  发布在  其他
关注(0)|答案(2)|浏览(192)

我有一个疑问,我不能解决。我读过embarcadero上的类构造函数的文档,但我不明白它的含义。换句话说,constructorclass constructor之间的用法区别是什么?我这样做:

type
 TGeneric<T> = class
  private
   FValue: T;
   aboutString: string;
   procedure setValue(const a: T);
  public
   property V: T read FValue write setValue;
   property about: string read aboutString;
   constructor Create;
   destructor Destroy; override;
 end;

implementation

{ TGeneric<T> }

constructor TGeneric<T>.Create;
begin
  inherited;
  aboutString := 'test';
end;

相反,此代码无法正常工作:

type
 TGeneric<T> = class
  private
   FValue: T;
   aboutString: string;
   procedure setValue(const a: T);
  public
   property V: T read FValue write setValue;
   property about: string read aboutString;
   class constructor Create;
   destructor Destroy; override;
 end;

implementation

{ TGeneric<T> }

class constructor TGeneric<T>.Create;
begin
  inherited;
  aboutString := 'test';
end;

我猜答案就在文档的这一行中:
通常,类别建构函式是用来初始化类别的静态字段或执行初始化型别,这是类别或任何类别执行严修能够正常运作之前所需的。
请告诉我是否正确:

    • 构造器 *:我可以使用inherited Create;,初始化变量等等。
    • 类构造函数 *:当我必须立即在我的类中创建一个对象时,我可以使用这个方法吗?

下面举例看看:

type
   TBox = class
   private
     class var FList: TList<Integer>;
     class constructor Create;
   end;

 implementation

 class constructor TBox.Create;
 begin
   { Initialize the static FList member }
   FList := TList<Integer>.Create();
 end;

 end.

在这里,当我在主窗体中调用TBox.Create时,我将立即创建对象。

oknwwptz

oknwwptz1#

  • 类构造函数只执行一次,当声明它的单元被初始化时。类构造函数是一个静态类方法,因此没有定义Self
  • 建构函式会在明确呼叫时执行,并具有初始化类别执行严修的工作。

在自然界中,类构造函数是很少见的,构造函数就像粪土一样常见。很可能你并不迫切需要类构造函数,所以现在可以忽略它们。集中精力理解如何编写和使用构造函数。
如果将来你需要初始化类所拥有的变量(而不是示例所拥有的变量),那么你可能会发现自己想要使用类构造函数。在那之前,你可以随意忽略它们。

vngu2lb8

vngu2lb82#

除了我的预发布,还应该提到的是,在您的示例中,每次示例化(引用)泛型特化时都会调用泛型类的类构造函数:

TGenClass<T: class> = class
public
  class constructor Create;
  class destructor Destroy;
end;

class constructor TGenClass<T>.Create;
begin
  Writeln('TGenClass<', GetTypeName(TypeInfo(T)), '> created');
end;

class constructor TGenClass<T>.Create;
begin
  Writeln('TGenClass<', GetTypeName(TypeInfo(T)), '> destroyed');
end;

initialization
  RegisterClass(TGenClass<String>);
  RegisterClass(TGenClass<Integer>);

输出将为:

TGenClass<String> created
TGenClass<Integer> created
TGenClass<String> destroyed
TGenClass<Integer> destroyed

但是,请注意,类的构造/销毁顺序根本不必与声明或引用顺序相匹配!

相关问题