Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.11.11;
Скачать: [xml.tar.bz2];

Вниз

Простой TObject   Найти похожие ветки 

 
OlegMa1   (2007-10-19 14:12) [0]

Если я делаю свой простой класс - наследник от TObject, то нужно ли мне в собственных конструкторе и деструкторе вызывать inherited предка?

TSimpleClass = class(TObject)
private
 FStringList: TStringList;
public
 constructor Create;
 destructore Free;
end;

constructor TSimpleClass.Create;
begin
 // inherited?
 FStringList := TStringList.Create;
end;

destructor TSimpleClass.Free;
begin
 FStringList.Free;
 //inherited Free? или Destroy?
end;


И ещё вопрос, чем отличается Free от Destroy: я так понял что первый перед тем как вызвать Destroy проверяет ссылку самого себя на nil, но что-то я не понимаю смысла всего этого, например когда вызывать Free а когда Destroy, что к чему?


 
Сергей М. ©   (2007-10-19 14:18) [1]


> нужно ли мне в собственных конструкторе и деструкторе вызывать
> inherited предка?


Вплоть до D7 - не нужно.


 
Ins ©   (2007-10-19 14:18) [2]


> то нужно ли мне в собственных конструкторе и деструкторе
> вызывать inherited предка?

В принципе не обязательно, так как в предке эти методы пустые, но лучше вызывать, вдруг в будущих версиях это будет не так.


> например когда вызывать Free а когда Destroy, что к чему?

Вызывать - Free, перекрывать - виртуальный Destroy


 
Сергей М. ©   (2007-10-19 14:21) [3]


> когда вызывать Free а когда Destroy


Free следует вызывать для неявной проверки ссылки на <> nil перед неявным же вызовом Destroy.

Явно вызывать Destroy следует только явно убедившись, что ссылка <> nil.


 
OlegMa1   (2007-10-19 14:27) [4]

destructor TSimpleClass.Destroy;
begin
FStringList.Free;
inherited Destroy;
end;


...
Применение:
...
MySimpleClass := TSimpleClass.Create;
MySimpleClass.Free;

Так для моего примера будет нормально?


 
KSergey ©   (2007-10-19 14:30) [5]

> OlegMa1   (19.10.07 14:27) [4]
> Так для моего примера будет нормально?

Вроде да.


 
Palladin ©   (2007-10-19 14:33) [6]

при освобождении агрегируемого объекта в деструкторе владельца нужно взять за правило всегда пользоваться Free


 
Jump   (2007-10-19 14:33) [7]

Не забудь:

TSimpleClass = class(TObject)
public
 destructor Destroy; override;
end;


 
Jump   (2007-10-19 14:34) [8]

Palladin ©   (19.10.07 14:33) [6]

А можно мне, в виде исключения, пользоваться FreAndNil()? А? Ну пожалуйста...


 
Palladin ©   (2007-10-19 14:37) [9]


> Jump   (19.10.07 14:34) [8]

монопенисуально, нет смысла приравнивать идентификатор объекта являющегося полем уничтожаемого объекта к Nil


 
OlegMa1   (2007-10-19 14:38) [10]

Хорошо, напомнили про override, без него получал предупреждение:
[Warning] Method "Destroy" hides virtual method of base type "TObject", но отчего же такое предуперждение не возникает для Create?


 
Ins ©   (2007-10-19 14:39) [11]


> но отчего же такое предуперждение не возникает для Create?

А он и невиртуальный. Create в TObject - статический метод.


 
Palladin ©   (2007-10-19 14:39) [12]

потому что Create не обязан быть виртуальным, соответственно предыдущую реализацию он не скрывает, вот переопределяет - это да


 
Kolan ©   (2007-10-20 08:38) [13]

> Вплоть до D7 &#151; не нужно.

Поподробнее плз&#133, что псле D7 нужно в конструкторе вызывать inherited?


 
Kolan ©   (2007-10-20 08:40) [14]

> TSimpleClass = class(TObject)

Автор, кстати TObject можно не писать, те:
TSimpleClass = class и сё.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2007.11.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.042 c
2-1192272904
apic
2007-10-13 14:55
2007.11.11
Права пользователя


15-1191581507
s_t_d
2007-10-05 14:51
2007.11.11
BIOS для MotherBoard VERTEX M1 94V-0


15-1191508929
Ega23
2007-10-04 18:42
2007.11.11
Рыдал


2-1192950932
hT9
2007-10-21 11:15
2007.11.11
Listview повторы


2-1193035306
temp_and_test
2007-10-22 10:41
2007.11.11
Какой объект вызывает ошибку Access Violation?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский