在我的工作场所,我们有一些代码class function
引用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
在类方法中存在潜在危险的情况。
我知道,指的是全局物体,并假设它们总是坏的。
答案 0 :(得分:6)
Self的含义是否在类方法中更改为引用类而不是对象?
在类方法Self
中引用类。 documentation说:
在类方法的定义声明中,标识符Self表示调用方法的类(可以是定义它的类的后代。)如果在类C中调用该方法,则Self属于C的类型类。因此,您无法使用Self访问实例字段,实例属性和普通(对象)方法。您可以使用Self来调用构造函数和其他类方法,或者访问类属性和类字段。
可以通过类引用或对象引用来调用类方法。当通过对象引用调用它时,对象的类将成为Self的值。
编译器不会使用Self
反对您,因为它是合法且受支持的事情。当你尝试使用实例成员,实例方法等时,它就会抱怨。
Self
在类方法中具有这种含义,其原因与实例方法中存在的完全相同。它允许您完全指定符号,从而避免范围模糊。更重要的是,它允许您访问调用该方法的实际类。这可能是定义方法的类的后代。
但是,我想知道是否有可能出现
Self
在类方法中存在潜在危险的情况。
我认为这部分语言没有特别的危险。事实上,Self
的使用减少了范围,因此降低了无意中引用局部变量而不是类成员的危险。