Delphi类变量每个类一个

13

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

给出以下示例:

  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;

我以为可以使用类变量来存储每个类创建的实例数量,但似乎情况并非如此。

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

我期望 fCreated 能够针对每个类类型进行维护,这不是重点吗?我错过了什么?

2个回答

15
您什么也不缺失。您对类变量工作原理的分析是正确的。类变量只不过是由类控制作用域的全局变量。
对于您来说,一个简单的解决方案是使用字典来计算实例。更巧妙的方法是使用我和Hallvard Vassbotn博客中介绍的技巧(滥用)虚函数表(VMT)来存储特定于类的字段。您可以在此处阅读有关此技巧的所有信息。

0
你看到 TDescendant.fCreated 与 TBaseClass.fCreated 是一样的,因为它们在同一个单元中,因此 TDesendant 可以访问 TBaseClass 的私有字段。如果你把它们放入不同的单元中,这个问题就会解决。或者如果你将 fCreated 声明为 Strict Private 而不是 Private,TDescendant 就无法看到它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接