为什么我可以从类外部访问私有类变量,如何防止这种情况发生?

12

我正在使用这段代码

type
 TSomeClass = class(TOBject)
 private
  class var InstanceCount : integer;
  class var TotalInstanceCount : integer;
 public
  class function instances: integer;
  class function totalInstances: integer;
  constructor Create;
  destructor Destroy;
end;

constructor TSomeClass.Create;
begin
 inherited Create;
 Inc(InstanceCount);
 Inc(TotalInstanceCount);
end;

destructor TSomeClass.Destroy;
begin
 Dec(InstanceCount);
 inherited;
end;

class function TSomeClass.instances;
begin
  Result := InstanceCount;
end;

class function TSomeClass.totalInstances;
begin
  Result := TotalInstanceCount;
end;

我想创建一个实例计数器,并将一些类变量设置为私有。问题很简单,只需看这张图片:

enter image description here

如您所见,在红色框中,有我声明为私有的类变量。我不希望它们出现。我只想让公共类函数能够显示计数器。我该怎么做?


这个类是在同一个单元中定义的吗? - Jerry Dodge
是的。我应该把这个类放在另一个单元里吗?然后在我拥有表单的主单元中说“使用带类的单元”。 - Raffaele Rossi
4
不一定,那只是证实了我的猜想。同一单元的类可以访问彼此的私有成员。如果我没记错的话,我相信 strict private 应该能解决你的问题。 - Jerry Dodge
我忘记了 strict,因为我很少使用它,你是对的。现在它可以工作了 :) - Raffaele Rossi
1个回答

16

文档所述,类的 private 部分可以从定义该类的单元中的任何地方访问。为了避免这种情况并消除在同一单元中其他地方对这些私有类成员的访问,请改用strict private

当然,如果您的应用程序设计需要,您也可以将此类移动到另一个单元中,这样也会产生您所需的效果。


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