11

考虑以下示例(我使用的是 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,一切都会按预期工作。

我错过了泛型的一些东西吗?或者它根本不起作用?

对此的任何想法都会受到赞赏!

谢谢,--斯特凡--

4

2 回答 2

11

我可以确认这是一个错误。如果类的唯一实例化在 .dpr 文件中,则类构造函数不会运行。如果您创建另一个单元,即一个单独的 .pas 文件,并TTestClass<Integer>从那里实例化 a,那么您的类构造函数将运行。

我已提交QC#103798

于 2012-02-29T15:18:19.587 回答
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.
于 2012-02-29T15:17:30.023 回答