2010-03-22 6 views
4

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

I.E.

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; 

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

+0

Это не выглядит как объявление записи для меня, а скорее как объявление объекта. Записи не имеют частных и общественных частей, ни конструкторов, ни методов. –

+2

@ Larry Lustig, да, записи могут иметь частные и публичные части. И конструкторы, свойства и методы. Они не могут наследовать или реализовывать интерфейсы. Но у них могут быть помощники по записи. –

+0

@Ларри, ты отстаешь на несколько лет. Записи получили методы, спецификаторы видимости и операторы в Delphi 2006. –

ответ

2

Конструкторы записи - абсолютно бессмысленный вводящий в заблуждение синтаксический сахар в собственном коде 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)

+0

Я определенно склоняюсь к этому мнению. Похоже, что для всех практических целей функциональность одна и та же - по какой-то причине я принимал конструктор конструктора без параметров; будет автоматически вызываться в создании записей, но это не так. – HMcG

+0

@HMcG: В Delphi отсутствуют конструкторы (и деструкторы) по умолчанию. Каждый раз, когда объект создается, конструктор называется явно в коде (хотя сам вызов может быть скрыт в VCL). Что касается записей, то вообще нет деструкторов записи, в то время как конструктор записи - не что иное, как метод записи. – kludg

+1

Справедливо верно, но ваш пример кода не будет компилироваться. (Так что есть небольшое различие между конструкторами записи и методами, указанными в моем ответе.) Попробуйте код, и вы получите: [Ошибка DCC] E2394 Конструкторы без параметров по типам записей –

0

Для построения записи используется конструктор. Он вызывается, когда запись сначала создается.

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

Вы можете создать процедуру «построения», но вы должны называть ее самостоятельно.

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



var 
    vec : TVector; 
begin 
    vec.Create; 

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

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

Насколько я могу судить по тестированию в D2009, конструктор Create все же должен быть специально вызван, он не вызывается автоматически. Я ожидал, что конструктор будет вызван, когда запись войдет в область видимости, но не может заставить ее сделать это. Это происходит в D2010? – HMcG

+0

Нет, конструкторы записи не вызываются автоматически. Могут быть разные конструкторы для разных целей, поэтому их следует вызывать автоматически? Действительный вызов может выглядеть так: aVector: = TVector.Create; –

+0

Итак, учитывая, что вам нужно вызвать конструктор специально, а записи не поддерживают наследование, а записи создаются автоматически и, следовательно, не обязательно иметь конструктор, если есть какая-либо практическая разница, которую вы можете представить между конструктором Create ; и процедура Create; ? – HMcG

1

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

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

+0

Почему? Конструктор может просто настраивать начальные значения либо полностью на свой собственный, либо получать их из какого-то глобального источника. (По общему признанию, я еще не пробовал. Мне не нужен конструктор записей.) –

+0

В Delphi вообще нет такой функции, как конструктор по умолчанию (а также деструктор по умолчанию). Вы можете объявить столько разных конструкторов/дескрипторов, сколько хотите, с любыми именами и параметрами, и ни одно из них не будет называться неявным образом. Что касается записи, конструктор записи - это всего лишь метод. – kludg

+0

Serg - попробуйте создать конструктор записей без параметров и отчитаться о результатах. Вы должны получить эту ошибку: http://docwiki.embarcadero.com/RADStudio/en/E2394_Parameterless_constructors_not_allowed_on_record_types_(Delphi) Я никогда не говорил, что определенный конструктор записи будет называться неявно. Я сказал, что по умолчанию записи имеют встроенный без параметров конструктор (что является вероятной причиной этой ошибки, поскольку записи не поддерживают наследование, поэтому, по-видимому, существует внутренний конструктор по умолчанию, рассмотренный как минимум.) –

Смежные вопросы