12

深いクラス階層の基本クラスにクラス変数を追加しました。クラスタイプごとに作成されたインスタンスの数をカウントするための整数です。しかし、私は問題に遭遇しました。

例を考えると:

  TBaseClass = class
  private
    class var fCreated: integer;
  public
    class function NewInstance: TObject; override;  
  end;

  TDescendant = class(TBaseClass)
  end;

  ...

  class function TBaseClass.NewInstance: TObject;
  begin
    result := inherited NewInstance;
    inc(fCreated);
  end;

クラス var を使用して、クラスごとに作成されたインスタンスの数を格納できると想定しましたが、そうではないようです。

検査TBaseClass.fCreatedすると と同じ値が返されTDescendant.fCreated、インスペクターを介して一方を変更すると他方が変更されるためfCreated、単一のグローバル変数であるかのように動作します。

fCreatedクラスタイプごとに維持されると思っていましたが、それがポイントではありませんか? 何が欠けていますか?

4

2 に答える 2

15

あなたは何も欠けていません。クラス変数がどのように機能するかについての分析は正しいです。クラス変数は、クラスによってスコープが設定されるグローバル変数にすぎません。

簡単な解決策の1つは、辞書を使用してインスタンスをカウントすることです。よりハッキーなアプローチは、Hallvard Vassbotnがブログに書いた私のトリックを使用することです。これは、VMTを使用してクラス固有のフィールドを格納します。あなたはそれについてのすべてをここで読むことができます。

于 2012-06-18T12:33:40.220 に答える