Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-58063
Fiend
2002-07-05 09:54
2002.07.18
удалённый запуск по Telnet


1-58086
Чайник2
2002-07-08 12:44
2002.07.18
CheckIt


14-58260
Polevi
2002-06-20 17:20
2002.07.18
анекдот


1-58091
zebra
2002-07-08 14:43
2002.07.18
Canvas Printer


3-58012
bobr12
2002-06-27 15:12
2002.07.18
InterBase - Как получить доступ к БД на сервере в сети





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский