Конструкторы записей (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;
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;
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;
2
3
4
5
6
7
8
9
10
11
Можно вызывать конструктор как функцию
var
C: TComplex;
begin
C:= TComplex.Create(0, 0);
end.
2
3
4
5
или как процедуру
var
C: TComplex;
begin
C.Create(0, 0);
end.
2
3
4
5
Обе формы корректны.
Пример выше может быть слишком упрошенным и выглядеть искусственно, но иногда возможность вызывать метод записи как функцию и как процедуру полезна и удобна.