在我的工作场所,如果没有初始化对象,我们会在其中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;
Run Code Online (Sandbox Code Playgroud)
但是,编译它会引发错误:
[dcc32 Error] Unit1.pas(51): E2076 This form of method call only allowed for class methods or constructor
Run Code Online (Sandbox Code Playgroud)
我还测试直接引用FTest,这给出了另一个错误:
[dcc32 Error] Unit1.pas(51): E2124 Instance member 'FTest' inaccessible here
Run Code Online (Sandbox Code Playgroud)
但是,我想知道是否有可能Self在类方法中存在潜在危险的情况.
我知道,指的是全球物体,并假设它们总是坏的.
Self的含义是否在类方法中更改为引用类而不是对象?
在类方法中Self引用类.该文件说:
在类方法的定义声明中,标识符Self表示调用方法的类(可以是定义它的类的后代.)如果在类C中调用该方法,则Self是C的类型类.因此,您不能使用Self来访问实例字段,实例属性和普通(对象)方法.您可以使用Self来调用构造函数和其他类方法,或者访问类属性和类字段.
可以通过类引用或对象引用来调用类方法.当通过对象引用调用它时,对象的类将成为Self的值.
编译器不会反对您使用,Self因为它是合法且受支持的事情.当你尝试使用实例成员,实例方法等时,它会抱怨
Self在类方法中具有这种含义的原因与实例方法中存在的完全相同.它允许您完全指定符号,从而避免范围模糊.更重要的是,它允许您访问调用该方法的实际类.这可能是定义方法的类的后代.
但是,我想知道是否有可能
Self在类方法中存在潜在危险的情况.
我没有看到这部分语言固有的特殊危险.事实上,使用Self缩小范围可以减少无意中引用局部变量而不是类成员的危险.
| 归档时间: |
|
| 查看次数: |
1070 次 |
| 最近记录: |