Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.07.18;
Скачать: CL | DM;

Вниз

Ведь он пустой!   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.013 c
1-58085
diww
2002-07-05 10:37
2002.07.18
Как узнать размер шрифта Windows?


1-58031
Smok_er
2002-07-04 23:20
2002.07.18
Компонент для выбора иконки


1-58202
TPavel
2002-07-06 12:06
2002.07.18
Закрытие программы


1-58162
newUser
2002-07-05 11:49
2002.07.18
Позиция курсора?


14-58290
Voldemar2
2002-06-21 17:30
2002.07.18
Как изменить свойство о кучи однотипных элементов?