Конструкторы записей (record) в Delphi

Вольный перевод поста Record Constructors in Delphiopen in new window

Конструкторы записей в Delphi — особенность языка которая вызывает вопросы. Зачем они нужны и когда их использовать вместо методов записей? В документации Delphiopen in new window написано следующее:

Records are constructed automatically, using a default no-argument constructor, but classes must be explicitly constructed. Because records have a default no-argument constructor, any user-defined record constructor must have one or more parameters.

Записи создаются автоматически, используя конструктор по умолчанию без параметров, а классы должны создаваться в явном виде. Из-за того что записи имеют конструктор по умолчанию без параметров любой определённый пользователем конструктор должен содержать как минимум один параметр.

Приведённая выше документация ничего не объясняет. В Delphi не существует такой вещи как "конструктор по умолчанию без параметров". Сразу возникает ещё один вопрос — почему в Delphi запрещены конструкторы без параметров и разрешены с параметрами?

На самом деле конструкторы записей в Delphi это просто специальный синтаксис для методов записей.

Предположим, вам нужна запись которая реализует комплексные числа и требуется метод инициализации. Вы можете использовать функцию

type
  TComplex = record
    Re, Im: Double;
    function Create(ARe, AIm: Double): TComplex;
  end;

  function TComplex.Create(ARe, AIm: Double): TComplex;
  begin
    Result.Re:= ARe;
    Result.Im:= AIm;
  end;
1
2
3
4
5
6
7
8
9
10
11

или процедуру

type
  TComplex = record
    Re, Im: Double;
    procedure Create(ARe, AIm: Double);
  end;

  procedure TComplex.Create(ARe, AIm: Double);
  begin
    Re:= ARe;
    Im:= AIm;
  end;
1
2
3
4
5
6
7
8
9
10
11

Используя конструктор в записи вы можете совместить обе формы

type
  TComplex = record
    Re, Im: Double;
    constructor Create(ARe, AIm: Double);
  end;

  constructor TComplex.Create(ARe, AIm: Double);
  begin
    Re:= ARe;
    Im:= AIm;
  end;
1
2
3
4
5
6
7
8
9
10
11

Можно вызывать конструктор как функцию

var 
  C: TComplex;
begin
  C:= TComplex.Create(0, 0);
end.
1
2
3
4
5

или как процедуру

var 
  C: TComplex;
begin
  C.Create(0, 0);
end.
1
2
3
4
5

Обе формы корректны.

Пример выше может быть слишком упрошенным и выглядеть искусственно, но иногда возможность вызывать метод записи как функцию и как процедуру полезна и удобна.

Последниее изменение: 24.08.2023, 06:42:55