Второй вызов Create
работ, как обычный вызов процедуры: она отсутствует какая-либо из специального строительного кодекса и только выполняет код пользователя в конструкторе. На практике это очень полезно, чтобы иметь возможность вызывать другие конструкторы от реализации конструктора:
constructor TLabel.CreateHello(AOwner: TComponent);
begin
// Perform default construction.
Create(AOwner);
// Set default text.
Caption := 'Hello';
end;
Сравните это с C++, где вы должны переместить общую логику для нескольких конструкторов в отдельную функцию, потому что вы не можете вызовите конструктор после создания объекта. Решение Delphi элегантно и поощряет повторное использование кода.
Для реализации этого существует скрытый дополнительный логический параметр для конструкторов, который указывает, выполнять ли полную логику построения (например, распределение памяти) или нет.
Я не уверен, почему вы удивлены. 'TLabel.Create (Self)' возвращает экземпляр 'TLabel', а' TLabel' имеет метод с именем 'Create', поэтому вы можете его вызвать. :-) Вы также можете использовать что-то вроде 'TLabel.Create (Self) .Free', а не то, что в этом случае это будет иметь смысл. –
Честно говоря, я был также очень удивлен, когда узнал, что «Constructor chaining» полностью легальна в Delphi. В учебниках часто не упоминается об этом. –
Это странно, потому что Create - это метод класса, вы, конечно, теряете память – Qsebas