4

在我的工作场所,我们有一些class functions 引用的代码Self,如果对象未初始化,则有效地创建潜在的访问冲突。Self类方法中更改的含义是否为引用类而不是对象?

我认为这是有效的唯一原因是因为Self引用另一个class function而不是常规方法。

我创建了以下测试类:

constructor TTest.Create;
begin
  FTest := 'Hej';
end;

procedure TTest.GoTest;
begin
  ShowMessage(FTest);
end;

class procedure TTest.Test;
begin
  Self.GoTest;
end;

但是,编译它会引发错误:

[dcc32 Error] Unit1.pas(51): E2076 This form of method call only allowed for class methods or constructor

我还测试了直接引用 FTest,这给出了另一个错误:

[dcc32 Error] Unit1.pas(51): E2124 Instance member 'FTest' inaccessible here

但是我想知道,Self在类方法中是否有可能存在潜在危险的情况。

我知道,引用全局对象并假设它们存在总是不好的。

4

1 回答 1

6

Self 在类方法中的含义是否改变为引用类而不是对象?

在一个类中方法Self是指类。文档说:

在类方法的定义声明中,标识符 Self 表示调用该方法的类(可以是定义它的类的后代)。如果在类 C 中调用该方法,则 Self 属于C 的类型类。因此,您不能使用 Self 访问实例字段、实例属性和普通(对象)方法。您可以使用 Self 调用构造函数和其他类方法,或访问类属性和类字段。

可以通过类引用或对象引用来调用类方法。当通过对象引用调用时,对象的类就变成了Self的值。

编译器不会反对您使用,Self因为这是合法且受支持的事情。当您尝试使用实例成员、实例方法等时,它只会抱怨。

Self在类方法中具有此含义,其原因与它存在于实例方法中的原因完全相同。它允许您完全指定一个符号,从而避免范围模糊。更重要的是,它允许您访问调用该方法的实际类。这可能是定义该方法的类的后代。

但是,我想知道Self在类方法中是否有可能存在潜在危险的情况。

我没有看到这部分语言固有的任何特殊危险。事实上,使用Self减少了范围,因此减少了无意中引用局部变量而不是类成员的危险。

于 2013-04-17T08:22:33.913 回答