Форум: "Начинающим";
Текущий архив: 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 — не нужно.
Поподробнее плз…, что псле 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