考虑以下示例(我使用的是Delphi XE):
program Test;
{$APPTYPE CONSOLE}
type
TTestClass<T> = class
private
class constructor CreateClass();
public
constructor Create();
end;
class constructor TTestClass<T>.CreateClass();
begin
// class constructor is not called. this line never gets executed!
Writeln('class created');
end;
constructor TTestClass<T>.Create();
begin
// this line, of course, is printed
Writeln('instance created');
end;
var
test: TTestClass<Integer>;
begin
test := TTestClass<Integer>.Create();
test.Free();
end.
从不调用类构造函数,因此不会打印“创建的类”行。
但是,如果我删除了泛化并将TTestClass<T>
转换为标准类TTestClass
,则一切都按预期工作。
我是否遗漏了仿制药?或者它根本不起作用?
对此的任何想法都会受到关注!
谢谢, --Stefan -
答案 0 :(得分:11)
我可以确认这是一个错误。如果类的唯一实例化在.dpr文件中,则类构造函数不会运行。如果您创建另一个单元,即单独的.pas文件,并从那里实例化TTestClass<Integer>
,那么您的类构造函数将运行。
我已提交QC#103798。
答案 1 :(得分:9)
看起来像编译器错误。如果将TTestClass声明和实现移动到单独的单元,则相同的代码可用。
unit TestClass;
interface
type
TTestClass<T> = class
private
class constructor CreateClass();
public
constructor Create();
end;
var
test: TTestClass<Integer>;
implementation
class constructor TTestClass<T>.CreateClass();
begin
Writeln('class created');
end;
constructor TTestClass<T>.Create();
begin
Writeln('instance created');
end;
end.