Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Классы


Страницы:   1 2 3 4

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 пустой невиртуальный конструктор.
Я всегда ставлю.


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо