TSL语言基础 > Object TSL > 方法

Self    

  • 在面向对象中,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所属对象的类名