Ключевое слово 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 ответов
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.