Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как правильн вызвать Destroy? [D7, XP]


Страницы:   1 2 3

Константин ©   (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;


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо