我已将类变量添加到深层类层次结构的基类中。它是一个整数,用于计算每个类类型创建的实例数。但是我遇到了一个问题。
给出示例:
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的全部内容。