В чем разница между конструктором и процедурой в записях Delphi? - PullRequest
4 голосов
/ 22 марта 2010

Есть ли разница в поведении между вызовом конструктора и вызовом процедуры в записях Delphi? У меня есть пример кода D2010, который я хочу преобразовать в D2009 (который я использую). В этом примере используется конструктор без параметров, что недопустимо в Delphi 2009. Если я подставляю простой вызов процедуры без параметров, есть ли функциональная разница для записей?

И.Е.

  TVector = record
  private
    FImpl: IVector;
  public
    constructor  Create;    // not allowed in D2009
  end;

становится

  TVector = record
  private
    FImpl: IVector;
  public
    procedure  Create;    // so change to procedure
  end;

Насколько я понимаю, это должно сработать, но я могу что-то упустить.

Ответы [ 3 ]

2 голосов
/ 24 марта 2010

Конструкторы записей являются абсолютно ненужным вводящим в заблуждение синтаксическим сахаром в собственном коде Win32. Единственное различие между конструктором записи и процедурой - синтаксис:

TVector = record
  constructor Create;
end;

var
  vec : TVector;

begin
  vec:= TVector.Create;

и

TVector = record
  procedure Create;
end;

var
  vec : TVector;

begin
  vec.Create;

AFAIK существует разница в коде .NET (я не использую .NET)

1 голос
/ 24 марта 2010

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

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

0 голосов
/ 22 марта 2010

Конструктор используется для создания записи. Вызывается при первом создании записи.

Функция может и должна вызываться по мере необходимости.

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

TVector = record
private
  FImpl: IVector;
public
  procedure Create;
end;



var
  vec : TVector;
begin
  vec.Create;

Альтернативой является создание фабричной функции, которая возвращает инициализированную запись.

function CreateVector(): TVector;
begin
  Result.Create;
end;
...