Подтвердить что ты не робот

Использование унаследованного в конструкторе "Создать" TObject

Должен ли я называть "унаследованным" в конструкторе класса, производного от TObject или TPersistent?

constructor TMyObject.Create;
begin
 inherited Create;   // Delphi doc: Do not create instances of TPersistent. Use TPersistent as a base class when declaring objects that are not components, but that need to be saved to a stream or have their properties assigned to other objects.    
 VectorNames := TStringList.Create;
 Clear;
end;
4b9b3361

Ответ 1

Да. Он ничего не делает, правда, но безвреден. Я думаю, что есть ценность в том, чтобы быть последовательным всегда призывать наследуемый конструктор, не проверяя, действительно ли есть реализация. Некоторые скажут, что стоит называть унаследованный Create, потому что Embarcadero может добавить реализацию для TObject.Create в будущем, но я сомневаюсь, что это правда; он сломает существующий код, который не вызывает унаследованный Create. Тем не менее, я думаю, что это хорошая идея назвать это только по причине согласованности.

Ответ 2

Я всегда это делаю.

Если вы переформатируете и переместите код на общего предка, вызов унаследованного Create имеет следующие преимущества:

  • Если у общего предка есть конструктор, вы не можете забыть его вызвать.
  • Если у общего предка есть конструктор с разными параметрами, компилятор предупреждает вас об этом.

Ответ 3

Вы также можете переопределить "процедуру AfterConstruction". Эта процедура всегда называется, независимо от того, какой конструктор.

public
  procedure AfterConstruction; override;
end;

procedure TfrmListBase.AfterConstruction;
begin
  inherited;
  //your stuff, always initialized, no matter what kind of constructor!
end;

Например: если вы хотите создать объект с другим конструктором, чем обычный TObject.Create, такой как TComponent.Create(AOwner) или настраиваемый (перегруженный) конструктор, вы можете получить проблемы, потому что ваше переопределение не вызывается и (в этом случае) ваша переменная "VectorNames" будет равна нулю.

Ответ 4

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