Delphi自我关键字

时间:2016-08-11 10:36:43

标签: delphi self

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

当我读到关于self内部记录的书时,我的想法就像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; 我指的是记录的字符,而不是指方法中传递的字符。这是使用自我的正确方法吗?它可能是Java self的兄弟吗?

4 个答案:

答案 0 :(得分:13)

Self与Java,C ++或C#中的this非常相似。但是,它会被更多地调用,如下面的代码所示。

在Delphi中,你可以使class方法不是静态的,但也有一个Self指针,这显然不会指向类的实例,而是指向类类型本身,调用方法。

请参阅此计划的输出:

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.

答案 1 :(得分:2)

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

答案 2 :(得分:0)

从形式上讲,Self是一个普通标识符(在某些情况下会自动预先声明)。

Self是在方法和类方法的实现中自动定义的,其目的与Java中的this类似(如上所述)。基础技术类似于普通函数中的Result变量。

换句话说,有 no self keyword (这就是为什么它通常用大写S编写的原因)。只要需要(并且可以 [*] ),您都可以引入自己的Self变量,方法或类。

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'

答案 3 :(得分:-1)

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