![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ведь он пустой! [D5]
MaximatorVeter © (2002-07-04 22:08:00)Дан класс-потомок TObject:
TForest=class
...
destructor Destroy; override;
end;
destructor TForest.Destroy;
begin
...
inherited destroy;//?
end;
Нужно ли вы вызывать в деструкторе данного класса деструктор родителя (а имеено деструктор TObject), ведь он пустой:
destructor TObject.Destroy;
begin
end;
kull (2002-07-07 03:02:00) [1]
> При вызове obj.Destroy; переменная Obj не уничтожится, как
> был
> 32 bit Pointer, так и останется. Даже не станет nil. Это
> ведь азы.
Оговорился.
Да не переменная, я имел ввиду объект.
Pointer то останется, но будет не действительным, т.к. объект уничтожен и при попытке достучаться к нему через переменнуюobj получим Access violation.
Макс Черных (2002-07-07 02:28:00) [2]Borland однозначно рекомендует вызывать inherited Destroy,
даже если он и пустой. Это вроде как признак хорошего стиля.
По поводу исходников - их ведь писало много разных людей,
поэтому ожидать единого стиля не приходится.
>Почему для TObject конструктор статический, а деструктор >виртуальный?
Для большей гибкости. Объект как известно уничтожается не
в момент вызова Destroy, а момент выхода из деструктора.
Обычно Destroy пишется в виде:
begin
//что то делаем
inherited Destroy;
end;
Виртуальный Destroy позволяет использовать конструкции типа:
begin
//что то делаем
inherited Destroy;
//что то делаем
end;
или
begin
inherited Destroy;
//что то делаем
end;
Для примера, выдержка из модуля Classes:
destructor TBasicAction.Destroy;
begin
inherited Destroy;
if Assigned(ActionComponent) then
ActionComponent.RemoveFreeNotification(Self);
while FClients.Count > 0 do
UnRegisterChanges(TBasicActionLink(FClients.Last));
FreeAndNil(FClients);
end;
В конструкторе же такая техника абсурдна и делать его
виртуальным не имеет смысла.
2 kull
При вызове obj.Destroy; переменная Obj не уничтожится, как был
32 bit Pointer, так и останется. Даже не станет nil. Это ведь азы.
kull (2002-07-07 01:31:00) [3]
> Но в classes.pas мы видим, что сами разработчики по разному
> делают
Мало ли что они делают.
В исходниках стандартных компонентов к Delphi можно встретить и такое:
begin
EnterCriticalSection(CS);
//что то делается
...
LeaveCriticalSection(CS);
end;
А мне кажется правильней так:
begin
EnterCriticalSection(CS);
try
//что то делается
...
finally
LeaveCriticalSection(CS);
end;
end;
> Почему для TObject конструктор статический, а деструктор
> виртуальный?
На верное для того чтобы можно было корректно уничтожить переменную типа TObject:
type
TMyClass = class(TObject)
destructor Destroy; override;
end;
var obj: TObject;
begin
obj := TMyClass.Create;
...
...
//здесь вызывается TMyClass.Destructor,
//а не TObject.Destructor
obj.Destroy;
end;
MaximatorVeter (2002-07-06 22:10:00) [4]Спасибо.
Но в classes.pas мы видим, что сами разработчики по разному делают - либо вызывают inherited Destroy либо нет.
Для примера возьмем TList:
TList = class(TObject)
destructor Destroy; override;
destructor TList.Destroy;
begin
Clear;
end;
и TPersistent:
TPersistent = class(TObject)
destructor Destroy; override;
destructor TPersistent.Destroy;
begin
RemoveFixups(Self);
inherited Destroy;
end;
тоже самое и с конструктором.
Вопрос еще такой:
Почему для TObject конструктор статический, а деструктор виртуальный?
С уважением.
Юрий Зотов (2002-07-05 01:30:00) [5]Если свой деструктор ничего, кроме inherited, не содержит, то он попросту не нужен. Совсем. О чем и сказал Anatoly Podgoretsky.
Если же содержит, то нужен. И тогда inherited лучше вызывать, даже если он пустой, как у TObject. Здесь я придерживаюсь точки зрения kull.
kull (2002-07-05 01:19:00) [6]В данном случае может быть и не нужно, НО кто знает какая реализация класса TObject будет в следующей версии Delphi.
Может он будет не пустой. Поэтому я бы посоветовал вызывать его всегда, мне кажется это хороший стиль написания кода.
Ведь при этом ты ничем не жертвуешь, тем более что "хлеба он не просит". :)
Anatoly Podgoretsky (2002-07-04 22:11:00) [7]Нет не нужно и сам он не нужен