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

Вниз

Простой 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.021 c
2-1193035306
temp_and_test
2007-10-22 10:41
2007.11.11
Какой объект вызывает ошибку Access Violation?


2-1192591433
balepa
2007-10-17 07:23
2007.11.11
Access Violation or Invalide Pointer operation


2-1191845204
xayam
2007-10-08 16:06
2007.11.11
Производительность


3-1183460384
Rule
2007-07-03 14:59
2007.11.11
Подскажите пожалуйста DAC компоненты под Delphi7 для доступа к MS


2-1193036940
_user_
2007-10-22 11:09
2007.11.11
Как учесть масштаб в свойствах экрана (96, 120... т/дюйм)?