![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Классы
student_92 © (2011-01-12 11:31:00)нужно ли в конструкторе вызывать inherited Create
type
TMyClass = class(TObject)
{ ... }
public
{ ... }
constructor Create(const AItemName: string);
{ ... }
end;
constructor TMyClass.Create(const AItemName: string);
begin
inherited Create; // <- ?
{ ... }
end;
Ega23 (2011-01-13 11:19:00) [61]
> Нафига init? Просто Instance.create.
А это к вопросу, нафига при наследовании от TObject inherited писать.
Сегодня одно, а завтра - другое. Добавится создание внутренних объектов, ещё какой-нибудь фигни.
Конструктор нужен для "выделения внутренней памяти", деструктор - для её зачистки. ИМХО.
oxffff (2011-01-13 11:16:00) [62]
> Ega23 © (13.01.11 11:07) [17]
>
> > Тут конечно на ум приходит отдельная procedure Initial,
>
> > но если конструктор именно это и делает, то и нет надобности
>
> > в отдельной Initial. Просто вызови экземпплярный конструктор.
>
>
>
> procedure Init; virtual; возможно abstract;
>
> constructor TFoo.Create;
> begin
> inherited;
> Init;
> end;
>
> Всегда так и делал, нафига конструктор-то?
Нафига init? Просто Instance.create.
Ведь конструктор это и есть инициализатор.
P.S.
Просто у него при классовом вызове добавляется аллокатор.
Ega23 (2011-01-13 11:07:00) [63]
> Тут конечно на ум приходит отдельная procedure Initial,
> но если конструктор именно это и делает, то и нет надобности
> в отдельной Initial. Просто вызови экземпплярный конструктор.
procedure Init; virtual; возможно abstract;
constructor TFoo.Create;
begin
inherited;
Init;
end;
Всегда так и делал, нафига конструктор-то?
oxffff (2011-01-13 11:06:00) [64]
> oxffff © (13.01.11 11:05) [15]
IMHO.
oxffff (2011-01-13 11:05:00) [65]
> Ega23 © (13.01.11 10:52) [14]
>
> > oxffff © (13.01.11 09:42) [13]
>
>
> А в чём прикол?
> Ну, в смысле, назови задачу, где вот именно такая надобность
> в таком изврате?
Например переинициализация объекта без перевыделения памяти.
Например объект содержит некоторое состояние, теперь нужно перевести объект в начальное состояние без перевыделения памяти(это дорого).
Тут конечно на ум приходит отдельная procedure Initial, но если конструктор именно это и делает, то и нет надобности в отдельной Initial. Просто вызови экземпплярный конструктор.
Ega23 (2011-01-13 10:52:00) [66]
> oxffff © (13.01.11 09:42) [13]
А в чём прикол?
Ну, в смысле, назови задачу, где вот именно такая надобность в таком изврате?
oxffff (2011-01-13 09:42:00) [67]Если рассмотреть конструктор как экзмемплярный метод, то его виртуальность может быть полезна. Я не призываю делать так, я просто показываю, когда это может быть удобно вне полезности виртальности при классовом методе.
ClassA=class
constructor create;virtual;abstract;
end;
ClassB=class(ClassA)
constructor create;override;
end;
procedure TForm3.FormCreate(Sender: TObject);
var a:ClassA;
begin
a:=ClassB.create;
a.create;
a.free;
end;
KSergey (2011-01-13 09:27:00) [68]> Leonid Troyanovsky © (12.01.11 22:13) [7]
> Подумать о потомках
Потомки конкретного класса не будут конструироваться через фабрику. Никогда. Зачем о них думать? "пусть будет"?
Anatoly Podgoretsky (2011-01-13 00:33:00) [69]> Ega23 (13.01.2011 00:14:08) [8]
Можно даже Result := inherited
_Юрий (2011-01-13 00:26:00) [70]некоторым аналогом виртуализации конструктора TObject является конструкция
<T: class, construtor>. Но только для случаев определения типов в компайл-тайм
Ega23 (2011-01-13 00:24:00) [71]Или вот тоже
constructor TObjectList.Create(AOwnsObjects: Boolean);
begin
inherited Create;
FOwnsObjects := AOwnsObjects;
end;
Ega23 (2011-01-13 00:14:00) [72]
> Подумать о потомках.
Не вижу причин в надобности виртуального конструктора, кроме коллекции классов (class of)
Во всех остальных случаях точно также статичный метод через inherited можно вызвать.
Тебя ведь не удивляет вызов
function TObjectList.Add(AObject: TObject): Integer;
begin
Result := inherited Add(AObject);
end;
Никакой виртуальности, однако...
Leonid Troyanovsky (2011-01-12 22:13:00) [73]
> _Юрий (12.01.11 22:08) [6]
> Зачем?
Подумать о потомках.
--
Regards, LVT.
_Юрий (2011-01-12 22:08:00) [74]
> Leonid Troyanovsky © (12.01.11 21:47) [4]
> Идеологически конструктору нужно быть виртуальным.
>
Зачем?
KSergey (2011-01-12 22:00:00) [75]В деструкторе тоже хорошо бы соотв. метод предка позвать, кстати!
Leonid Troyanovsky (2011-01-12 21:47:00) [76]
> Ega23 © (12.01.11 11:33) [1]
> Идеологически - нужно всегда
Идеологически конструктору нужно быть виртуальным.
> Amoeba_ (12.01.11 11:36) [3]
> Если наследование непосредственно от TObject, то вызов конструктора
> предка не является обязательным.
И не обязательно class(TObject), можно просто - class.
--
Regards, LVT.
Amoeba_ (2011-01-12 11:36:00) [77]Если наследование непосредственно от TObject, то вызов конструктора предка не является обязательным.
student_92 (2011-01-12 11:35:00) [78]все ясн, спасибо
Ega23 (2011-01-12 11:33:00) [79]
> нужно ли в конструкторе вызывать inherited Create
Идеологически - нужно всегда. Вдруг у тебя предок изменится?
В данном конкретномслучае - можно и не вызывать, ибо у TObject пустой невиртуальный конструктор.
Я всегда ставлю.