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 に答える