Конструктор 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 не определен.
  • Конструктор выполняет при явном вызове и выполняет задание инициализации экземпляра класса.

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

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