在面向对象中,self有多种用途:
第一种:在指定方法时,可以通过self指向当前的实例对象。
第二种:self(N)方式,可以在类中创建当前类对象或创建实例所属对象。
第一种用途:
在实现方法时,标志符Self 引用方法所属的对象,如果是类方法,Self引用方法所属的类。
格式为:
Self.functionName();
编译器会自动匹配所调用的方法,Self方法一般可以省略。
有一点注意的是:
Self总是指向当前的实例对象。而不是Self所在的类的实例对象。与继承混合使用是需要注意。
示例:
Program test;
type A= class
Function F(); virtual;
Begin
Self.F2();
End;
Function F2();virtual;
Begin
Writeln("A.F2");
End;
End;
Type B = class(A)
Function F2();override;
Begin
Writeln("B.F2");
End;
end;
Begin
AA:=CreateObject("A");
AA.F();//输出 A.F2;
BB:=CreateObject("B");
BB.F();//输出 B.F2()
End.
说明:
AA:=CreateObject("A");
AA.F();//输出 A.F2;
创建了类型A的实例对象,F()中的Self.F2(),表示调用的是类型A的F2();
BB:=CreateObject("B");
BB.F();//输出 B.F2()
以上代码创建了类型B的实例对象,F()中的Self.F2()表示调用类型B的F2()
Self的这种特性在某些情况下会出现理解上的歧义,如果想固定Self的意义,让他只表示当前的类。需要用Class(ClassName).FunctionName做替换。
以上代码中的Self.F2()需要换成 Class(A).F2();
那么以上代码输出
A.F2
A.F2
第二种用途:
在实现方法时,可以通过self(1)创建一个当前实例所属对象的实例对象。
self(0)等同于self()即创建一个当前方法所在类的实例对象。
如:
Function Test_Ooself();
Begin
obj:=CreateObject('TestSelf');
obj.Test1();
End;
Type TestSelf=class(TDTestFClass)
Function Test1();
begin
returnV1();
returnV0();
end
end;
Type TDTestFClass=class()
Public
Function returnV1();
Begin
ss:=self(1); //创建当前实例所属类的实例对象
echo "TDTestFClass-returnV1 ", ss.classinfo()['classname'];
End;
Function returnV0();
Begin
ss:=self(0); //创建当前类的对象
echo "TDTestFClass-returnV0 ", ss.classinfo()['classname'];
End;
End;
打印结果如下:
TDTestFClass-returnV1 testself
TDTestFClass-returnV0 tdtestfclass
注:示例中ss.classinfo()['classname'];是获取ss所属对象的类名