Конструктор Delphi и конструктор классов
У меня есть сомнения, что я не могу решить. Я прочитал документацию на embarcadero для конструкторов классов, но я не могу понять смысл этого. Другими словами, какова разница в использовании между constructor
и a class constructor
? Я сделал это:
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;
Я думаю, что ответ указан в этой строке документации:
Обычно конструкторы классов используются для инициализации статических полей класса или выполнить тип инициализации, который требуется перед тем, как класс или любой экземпляр класса могут нормально функционировать.
Скажите, если я прав:
- Конструктор: я могу использовать
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
в основной форме?
Ответы
Ответ 1
- Конструктор класса выполняется ровно один раз, когда инициализируется единица, в которой она объявлена. Конструктор класса - это метод статического класса, поэтому
Self
не определен.
- Конструктор выполняет при явном вызове и выполняет задание инициализации экземпляра класса.
В дикой природе конструкторы классов редки, конструкторы так же распространены, как гадость. Вполне вероятно, что у вас нет непосредственной необходимости для конструкторов классов, поэтому не стесняйтесь их игнорировать пока. Сосредоточьтесь на понимании того, как писать и использовать конструкторы.
Если в будущем вам нужно будет инициализировать переменные, принадлежащие классу (в отличие от принадлежащего экземпляру), вы можете захотеть использовать конструктор класса. До этого момента не стесняйтесь их игнорировать.