【问题标题】:Delphi Class variable per class每个类的 Delphi 类变量
【发布时间】:2025-12-10 23:45:01
【问题描述】:

我已将类变量添加到深层类层次结构的基类中。它是一个整数,用于计算每个类类型创建的实例数。但是我遇到了问题。

举个例子:

  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 为每个班级类型维护,这不是重点吗?我错过了什么?

【问题讨论】:

    标签: delphi class variables


    【解决方案1】:

    你什么都没有。您对类变量如何工作的分析是正确的。类 var 只不过是一个由类限定的全局变量。

    一个简单的解决方案是使用字典来计算实例。一个更 hacky 的方法是使用我在 Hallvard Vassbotn 博客中提到的一个技巧,它(ab)使用 VMT 来存储特定于类的字段。您可以阅读有关它的所有信息here

    【讨论】:

      【解决方案2】:

      您看到 TDescendant.fCreated 与 TBaseClass.fCreated 相同,因为它们在同一个单元中,因此 TDesendant 看到 TBaseClass 私有字段。如果您将它们放入单独的单元中,这将结束。如果你声明 fCreated 不是 Prvate,而是 Strict Private,TDescendant 不会看到它。

      【讨论】: