Форум: "Основная";
Текущий архив: 2002.07.18;
Скачать: [xml.tar.bz2];
ВнизВедь он пустой! Найти похожие ветки
← →
MaximatorVeter (2002-07-04 22:08) [0]Дан класс-потомок TObject:
TForest=class
...
destructor Destroy; override;
end;
destructor TForest.Destroy;
begin
...
inherited destroy; //?
end;
Нужно ли вы вызывать в деструкторе данного класса деструктор родителя (а имеено деструктор TObject), ведь он пустой:
destructor TObject.Destroy;
begin
end;
← →
Anatoly Podgoretsky (2002-07-04 22:11) [1]Нет не нужно и сам он не нужен
← →
kull (2002-07-05 01:19) [2]В данном случае может быть и не нужно, НО кто знает какая реализация класса TObject будет в следующей версии Delphi.
Может он будет не пустой. Поэтому я бы посоветовал вызывать его всегда, мне кажется это хороший стиль написания кода.
Ведь при этом ты ничем не жертвуешь, тем более что "хлеба он не просит". :)
← →
Юрий Зотов (2002-07-05 01:30) [3]Если свой деструктор ничего, кроме inherited, не содержит, то он попросту не нужен. Совсем. О чем и сказал Anatoly Podgoretsky.
Если же содержит, то нужен. И тогда inherited лучше вызывать, даже если он пустой, как у TObject. Здесь я придерживаюсь точки зрения kull.
← →
MaximatorVeter (2002-07-06 22:10) [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 конструктор статический, а деструктор виртуальный?
С уважением.
← →
kull (2002-07-07 01:31) [5]
> Но в 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;
← →
Макс Черных (2002-07-07 02:28) [6]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 03:02) [7]
> При вызове obj.Destroy; переменная Obj не уничтожится, как
> был
> 32 bit Pointer, так и останется. Даже не станет nil. Это
> ведь азы.
Оговорился.
Да не переменная, я имел ввиду объект.
Pointer то останется, но будет не действительным, т.к. объект уничтожен и при попытке достучаться к нему через переменную obj получим Access violation.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.07.18;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.005 c