Delphi self 关键字

Delphi self keyword

我正在学习 Delphi 阅读 Marco Cantu 的书,它非常完整。很清楚,但是我对关键字self有疑问。我已经有了 OOP 的经验,并且掌握了它的基础知识。我的问题很简单。我可以将关键字 self (Delphi) 与关键字 this (Java) 进行比较吗?

当我读到有关 self 使用内部记录的书时,我想到了 self : Delphi = this : Java。查看我创建的代码来进行测试:

type
 TMarioKart = packed record
   Character: String;
   Kart: String;
   Tires: String;
   Speed: double;
   Competitive: boolean;
  private
   air-speed: integer;
   ground-speed: integer;
   water-speed: integer;
  public
   constructor Create(Character: string);
   function ShowStats(a: TMarioKart):string; overload;
   function ShowStats(a: TMarioKart; b: TMarioKart): string; overload;
 end;

我要删掉大部分代码,我只是在这里展示构造函数:

constructor TMarioKart.Create(Character: string);
begin
  self.Character := Character;
end;

这里使用关键字self指的是记录的字符,而不是方法中传递的字符。这是使用自我的正确方法吗?难道是Java的this的兄弟?

是的,Delphi 的 Self 是 Java 的 this 的直接模拟。

Self 与 Java、C++ 或 C# 中的 this 非常相似。然而,它被调用得更多一些,如以下代码所示。

在 Delphi 中,你可以有 class 方法,这些方法不是静态的,但也有一个 Self 指针,显然它不指向 [=22] 的实例=] 但对于调用该方法的 class 类型本身。

查看此程序的输出:

program WhatIsSelf;

{$APPTYPE CONSOLE}

type
  TAnimal = class
    procedure InstanceMethod;
    class procedure ClassMethod;
    class procedure StaticClassMethod; static;
  end;

  TDog = class(TAnimal)
  end;

class procedure TAnimal.ClassMethod;
begin
  Writeln(Self.ClassName);
end;

procedure TAnimal.InstanceMethod;
begin
  Writeln(Self.ClassName);
end;

class procedure TAnimal.StaticClassMethod;
begin
//  Writeln(Self.ClassName); // would not compile with error: E2003 Undeclared identifier: 'Self'
end;

var
  t: TAnimal;
begin
  t := TDog.Create;
  t.InstanceMethod;
  t.ClassMethod;

  TAnimal.ClassMethod;
  TDog.ClassMethod;

  Readln;
end.

正式来说,Self 是一个普通标识符(在某些情况下会自动预先声明)。

Self是在方法的实现中自动定义的,class方法的作用类似于前面提到的Java中的this。底层技术类似于普通函数中的Result变量

换句话说,有no self keyword(这就是为什么它通常用大写S来写)。您可以随时(也可以 [*])引入自己的 Self 变量、方法或 class.

type
  // TForm1 ommitted

  Self = class
    function Self: Integer;
  end;

function Self.Self: Integer;
begin
  Result := SizeOf(Self);
end;

在方法中实例化此类对象当然会遇到困难,在这些情况下,您必须通过适配器函数(或过程)使用它:

function UseSelf: Integer;
var
  S: Self;
begin
  S := Self.Create;
  Result := S.Self;
  S.Free;
end;

function VarSelf: Integer;
var
  Self: Integer;
begin
  Self := SizeOf(Result);
  Result := Self;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(IntToStr(UseSelf)+' '+IntToStr(VarSelf));
end;


[*] 你不能在方法中声明一个 Self 变量,因为已经有这样的声明,这正是错误所说的:

Identifier redeclared: 'Self'

self 是一个特殊变量,它指向拥有当前正在执行的代码的对象,并提供对当前对象的访问权限。在 Ruby 编程语言中也有 self,但是在 JavaScript、C++、C# 和 Java 中的等价物是 this,在 VB 中是 Me。