Ключевое слово Delphi self

Я изучаю Delphi, читая книгу Марко Канту, и она супер полная. Это очень ясно, но я сомневаюсь в ключевом слове self. У меня уже есть опыт работы с ООП и у меня есть основы. Мой вопрос очень прост. Могу ли я сравнить ключевое слово self (Delphi) к ключевому слову этой (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?

2 ответов


да, в Delphi Self является прямым аналогом Java this.


Self очень похоже на this в Java, C++ или C#. Однако он немного больше вызывается, как покажет следующий код.

в 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.