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;

我假设我可以使用 class var 来存储每个 class创建的实例数,但事实并非如此。

检查TBaseClass.fCreated返回与 相同的值TDescendant.fCreated,通过检查器更改一个值会更改另一个值,因此它的行为就像fCreated是单个全局变量。

我希望fCreated每个班级类型都得到维护,这不是重点吗?我错过了什么?

4

2 回答 2

15

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

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

于 2012-06-18T12:33:40.220 回答
0

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

于 2020-08-01T07:17:29.307 回答