![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как правильн вызвать Destroy? [D7, XP]
Константин © (2010-04-02 15:00:00)Как правильно вызвать Destroy у объекта, который унаследован от TObjectList и в котором есть свойство Strings TStringList
Делаю так:
destructor Destroy;
....
destructor TOMyObjtct.Destroy;
begin
Strings.Free;
inherited;
end;
Не пойму. В таком варианте вроде работает, но непонятно как память освобождает. А вот если объявить деструктор как
destructor Destroy; override;
То в него заходит деббагер но ошибка на вызове деструктора предка!
Дмитрий Белькевич (2010-04-06 12:17:00) [21]
> А критиковать все могут.
Ну ты с этим согласись, а там - дальше поедем ;) Будешь упорствовать в ереси - никто больше ничего не скажет ;)
Дмитрий Белькевич (2010-04-06 12:14:00) [22]
> Почему через ReadOnly можно и через ReadWrite - это уже
> по задаче и без всяких методов, хотя на запись метод напрашивается,
> что бы было надежно, без утечек и контролируемо.
ReadWrite в данном случае зачем может понадобится? Не могу сразу придумать.
Константин (2010-04-06 12:08:00) [23]
> Дмитрий Белькевич (06.04.10 11:50) [30]
Вот хорошо, что вы заметили, я думал уже никто не напишет.
Вот вы все пишите пишите. Грубейшее нарушение ООП, методы доступа, и никто не написал "да, у TObjectList нету поля Strings, но ты там то хреново сделал, там ошибки грубейшие, ты не прав". Телепатируете? ))
Вообщем ребят, давайте жить дружно, как говорится. А критиковать все могут.
Anatoly Podgoretsky (2010-04-06 12:02:00) [24]> Дмитрий Белькевич (06.04.2010 11:57:33) [33]
Почему через ReadOnly можно и через ReadWrite - это уже по задаче и без всяких методов, хотя на запись метод напрашивается, что бы было надежно, без утечек и контролируемо.
Вообще чистое ООП не подразумевает доступность каких либо полей напрямую, только через методы (свойства)
Дмитрий Белькевич (2010-04-06 11:57:00) [25]
> и прочие недостатки и неточности.
Это не недостаток и не неточность. Это грубейшее нарушение принципов ООП.
> так как не хотел писать метод доступа для private поля.
Он пишется буквально за 2 секунды.
procedure Add(const s: string);
после - ctrl-shift-c.
Или, как Подгорецкий говорит, можно FStrings вытащить наружу через read-only свойство:
Сергей М. (2010-04-06 11:54:00) [26]
> думаю вы понимаете смысл моих слов и мыслей
Если бы понимал - не спрашивал бы)
Откуда ж мне знать, что причина публикования частного поля - всего лишь в "не хотел писать метод доступа ", но при этом ты вполне осознаешь чем это чревато ?)
Я по-твоему обязан телепатировать ?)
Anatoly Podgoretsky (2010-04-06 11:50:00) [27]> Константин (06.04.2010 11:47:29) [29]
метод доступа для private поля совсем не обязателен, посмотри тему по свойствам, особое внимание на модификторы
Дмитрий Белькевич (2010-04-06 11:50:00) [28]
> Может он не умеет работать со свойствами.
Судя по его коду, и свойство не нужно. Достаточно сделать метод типа AddEx (что бы с предком не пересекался, да).
a := TA.Create(True);
a.Add(a);
Зачем TA добавляет сам себя в контейнер? Не понял. Он сам себя не разрушит?
Константин (2010-04-06 11:47:00) [29]
> Да и можешь ли ты вразумительно объяснить причину публиковангия
> тобой поля FStrings ?
Публикования? Это того что я занес в секцию public? Если да, то я занёс так скажем по привычке того, что я запишу в обработчике кнопки строку, так как не хотел писать метод доступа для private поля. Думаю это можно понять и я думаю вы понимаете смысл моих слов и мыслей, раз уж вы мастер (ничего личного), так скажем. Да и я пример привёл с override Clear - это самое важно место я и хотел показать, поэтому и забыл написать inherited Create(OwnsObjects); и прочие недостатки и неточности.
Дмитрий Белькевич (2010-04-06 11:46:00) [30]
> А при чём тут предок?
Увидел.
Тем не менее:
> Частные структуры класса должны скрываться внутри класса.
Anatoly Podgoretsky (2010-04-06 11:43:00) [31]> Сергей М. (06.04.2010 11:35:25) [25]
Может он не умеет работать со свойствами.
Дмитрий Белькевич (2010-04-06 11:40:00) [32]
> Согласен, но у предка нету такого поля.
А при чём тут предок? Частные структуры класса должны скрываться внутри класса.
Сергей М. (2010-04-06 11:35:00) [33]
> Константин (06.04.10 11:19) [24]
> у предка нету такого поля
Сегодня нет, а завтра, в каком-то другом классе, найдется.
Поэтому тебе и говорят - привыкай общепринятому к порядку, минимизирующему риск наступить на подобные грабли.
Да и можешь ли ты вразумительно объяснить причину публиковангия тобой поля FStrings ?
Думаю что нет)
Константин (2010-04-06 11:19:00) [34]
> Сергей М. © (06.04.10 11:06) [23]
Согласен я просто в порыве страсти забыл дописать
inherited Create(OwnsObjects);
> Leonid Troyanovsky © (06.04.10 11:01) [21]
Верно. Но наименование поля тут непричём.
> Сергей М. © (06.04.10 11:06) [23]
> А публикование поля FStrings - этот источник потекциальных
> граблей.
Согласен, но у предка нету такого поля.
Сергей М. (2010-04-06 11:06:00) [35]
> Константин (06.04.10 10:58) [19]
> Это понятно, и дело не в этом
Как же не в этом, когда именно в этом ?)
Отсутствие вызова конструктора наследуемого класса как раз и приводит к описанным тобой выше граблям.
А публикование поля FStrings - этот источник потекциальных граблей.
Leonid Troyanovsky (2010-04-06 11:03:00) [36]
> Константин (06.04.10 10:59) [20]
> думаю, тему вообще надо закрыть, во избежание дальнейшего
> бреда...
Ну, дык, кто ж мешает избегать.
--
Regards, LVT.
Leonid Troyanovsky (2010-04-06 11:01:00) [37]
> Константин (06.04.10 10:25) [17]
Inherited Destroy вызывает Clear,
а FStrings к тому моменту уже разрушен.
--
Regards, LVT.
Константин (2010-04-06 10:59:00) [38]думаю, тему вообще надо закрыть, во избежание дальнейшего бреда...
Константин (2010-04-06 10:58:00) [39]
> Сергей М. © (06.04.10 10:40) [18]
Это понятно, и дело не в этом. Пусть мне люди которые говорили о FStrings объяснят то что я спросил.
Потому что получается так, что я вот допустим написал public, и из меня делают лузера и всё такое, а сами же (не вы Сергей) несут полнейшую чушь.
> Для начала замени Strings на FStrings, например, так как
> Strings в предке может использоваться.
Терпеть не могу умников. Мы по-моему уже обсуждали с вами, Сергей, других людей, которые тут есть еще.
Сергей М. (2010-04-06 10:40:00) [40]
public// <-- нашиша это поле делать публичным ?
FStrings: TStringList;
constructor TA.Create(OwnsObjects: Boolean);
begin
inheritred Create(OwnsObjects);// <-- грабли - в отсутствии инициализации объекта-предка
FStrings := TStringList.Create;
end;