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

给出示例:

  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,这不是重点吗?我想念什么?

最佳答案

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

一个简单的解决方案是使用字典对实例进行计数。一种更具技巧性的方法是使用Hallvard Vassbotn发表的一篇技巧,该技巧(ab)使用VMT存储特定于类的字段。您可以阅读here的全部内容。

07-27 19:53