2016-09-13 2 views
11

У меня есть сомнения, что я не могу решить. Я прочитал документацию на embarcadero за class constructors, но я не могу понять смысл этого. Другими словами, какова разница в использовании между constructor и class constructor? Я сделал это:Конструктор и конструктор Delphi

type 
TGeneric<T> = class 
    private 
    FValue: T; 
    aboutString: string; 
    procedure setValue(const a: T); 
    public 
    property V: T read FValue write setValue; 
    property about: string read aboutString; 
    constructor Create; 
    destructor Destroy; override; 
end; 

implementation 

{ TGeneric<T> } 

constructor TGeneric<T>.Create; 
begin 
    inherited; 
    aboutString := 'test'; 
end; 

Вместо этого код не работает должным образом:

type 
TGeneric<T> = class 
    private 
    FValue: T; 
    aboutString: string; 
    procedure setValue(const a: T); 
    public 
    property V: T read FValue write setValue; 
    property about: string read aboutString; 
    class constructor Create; 
    destructor Destroy; override; 
end; 

implementation 

{ TGeneric<T> } 

class constructor TGeneric<T>.Create; 
begin 
    inherited; 
    aboutString := 'test'; 
end; 

Я думаю, что ответ находится в этой строке документации:

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

Скажите мне, если я правильно:

  • Constructor: Я могу использовать inherited Create;, инициализировать переменные и так далее.
  • Конструктор классов: Я могу использовать это, когда мне нужно немедленно создать объект в моем классе?

Например смотрите на ниже:

type 
    TBox = class 
    private 
    class var FList: TList<Integer>; 
    class constructor Create; 
    end; 

implementation 

class constructor TBox.Create; 
begin 
    { Initialize the static FList member } 
    FList := TList<Integer>.Create(); 
end; 

end. 

Здесь я собираюсь немедленно создать объект, когда я называю TBox.Create в главной форме?

+3

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

+0

Так что я могу избежать этого и заботиться только о классическом конструкторе? –

+0

Это зависит от того, что вы хотите сделать. Класс var является своего рода глобальной переменной для этого типа и может быть полезен в некоторых случаях. –

ответ

17
  • Конструктор классов выполняется ровно один раз, когда единица, в которой она объявлена, инициализируется. Конструктор класса - это метод статического класса, поэтому Self не определен.
  • Конструктор выполняет при явном вызове и выполняет инициализацию экземпляра класса.

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

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

+3

Обратите внимание, что при использовании класса выполняется только «конструктор класса» ** ** **. Таким образом, в отличие от нормального раздела 'initialization' блока (который всегда выполняется), он выполняется только в том случае, если класс используется * где-то *. То же самое верно для 'class destructor'. –

+0

Раздел инициализации выполняется тогда и только тогда, когда на него ссылаются. Аналогично конструктор класса. Вызывается только если класс ссылается. –

+0

Только в том случае, если класс ** используется **. Вы можете объявить переменную класса, но она не будет работать. Начальные секции всегда запускаются, как только блок включен. –

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