我有一个疑问,我不能解决。我读过embarcadero上的类构造函数的文档,但我不明白它的含义。换句话说,constructor
和class 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
时,我将立即创建对象。
2条答案
按热度按时间oknwwptz1#
Self
。在自然界中,类构造函数是很少见的,构造函数就像粪土一样常见。很可能你并不迫切需要类构造函数,所以现在可以忽略它们。集中精力理解如何编写和使用构造函数。
如果将来你需要初始化类所拥有的变量(而不是示例所拥有的变量),那么你可能会发现自己想要使用类构造函数。在那之前,你可以随意忽略它们。
vngu2lb82#
除了我的预发布,还应该提到的是,在您的示例中,每次示例化(引用)泛型特化时都会调用泛型类的类构造函数:
输出将为:
但是,请注意,类的构造/销毁顺序根本不必与声明或引用顺序相匹配!