Главная страница
    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.046 c
15-1191309571
Ega23
2007-10-02 11:19
2007.11.11
Задачник посоветуйте


2-1192983475
saymon
2007-10-21 20:17
2007.11.11
key violation


15-1190975008
pavel_guzhanov
2007-09-28 14:23
2007.11.11
Подскажите хороший форум по железу


2-1192461964
тим
2007-10-15 19:26
2007.11.11
кнопка в заголовке


2-1192790942
Shakesbeer
2007-10-19 14:49
2007.11.11
Работа с com-портом.





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