Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.192] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 471 472 [473] 474 475 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#7081
,
|
|
|
|
? а... это, Destroy - это деструктор в Делфи, да? И в Делфи можно в теле деструктора указывать путем inherited; порядок вызова родительского? Ппц Спасибо кнечно, и ничего против не имею, но мне б и так не подошло - т.к. дочерний класс я писал не на Делфи. Добавлено Shaggy, все равно не понял. Зачем мне после inherited; удалять свое, если сам факт вызова inherited вызовет родительский деструктор в котором вызовется Clear в котором свое уже и так потрется? |
|
Сообщ.
#7082
,
|
|
|
|
Как я понял, в деструкторе базового класса вызывается виртуальный метод Clear(), в котором ты уже очистишь свое. Но об этом вызове нужно знать или заводить флажки - очистили мы свое или нет В любом случае - каша и никакого разделения между классами иерархии |
|
Сообщ.
#7083
,
|
|
|
|
Мляаааааа... Как это всё мило
|
|
Сообщ.
#7084
,
|
|
|
|
А слабо чистить так, чтобы даже повторный вызов работал правильно? Тогда и флаги не нужны
|
|
Сообщ.
#7085
,
|
|
|
|
Цитата Chow @ Зачем мне после inherited; удалять свое, если сам факт вызова inherited вызовет родительский деструктор в котором вызовется Clear в котором свое уже и так потрется? 1. на примере: твоё поле - список тогда в clear - list.clear в деструкторе - list.free; 2. если же ты в clear именно удаляешь поле, то это надо делать так: anyobj.free; anyobj:=nil или freeandnil(anyobj); а иначе(если ты не заnilивашь ссылку) ССЗБ, тебе не кажется? |
|
Сообщ.
#7086
,
|
|
|
|
D_KEY, как бы фабрика выглядела на сях?
|
|
Сообщ.
#7087
,
|
|
|
|
Цитата --Ins-- @ А слабо чистить так, чтобы даже повторный вызов работал правильно? кстати, да два clear подряд и av - замечательно |
|
Сообщ.
#7088
,
|
|
|
|
Цитата --Ins-- @ D_KEY, как бы фабрика выглядела на сях? На сях? Тяжко. На С++ правда тоже не слишком красиво - нужно ручками регистрировать нужные типы, если хотим получать объекты по имени класса, например. Добавлено Цитата Shaggy @ ССЗБ, тебе не кажется? Ну так сначала создали проблему в языке, а вы теперь ее героически преодолеваете. |
|
Сообщ.
#7089
,
|
|
|
|
Цитата D_KEY @ Ну так сначала создали проблему в языке это уже просто упрямство решение т.н. "проблемы" не займёт и строчки кода поле всё равно удаляем, так напиши freeandnil(obj) вместо obj.free и всё, с деструктором шаманить не придётся |
|
Сообщ.
#7090
,
|
|
|
|
Цитата Shaggy @ поле всё равно удаляем Зачем это делать руками ? Неудобно ведь и забыть можно... |
|
Сообщ.
#7091
,
|
|
|
|
Цитата --Ins-- @ А зачем вмешиваться во что-то кем-то написанное на разных этапах, если в результате всё получим кастомное? Не проще ли в этом случае кастомно сразу и написать? Эффективнее будет работать, и платить не придётся, если не юзаем. А на самом деле там очень гибкий процесс конструирования с возможностью программиста вмешиваться в различные этапы и элегантно реализовывать многие сложные вещи |
|
Сообщ.
#7092
,
|
|
|
|
Цитата D_KEY @ Зачем это делать руками ? Неудобно ведь и забыть можно... мы всё ещё про пример Chow, да? метод clear(не деструктор), удаление поля как это можно сделать "не руками"? |
|
Сообщ.
#7093
,
|
|
|
|
Цитата D_KEY @ На С++ правда тоже не слишком красиво - нужно ручками регистрировать нужные типы, если хотим получать объекты по имени класса, например. А ты говоришь, зачем нужно, зачем нужно... Чтобы не было тяжко, вестимо. Человеческий мозг и время - слишком ценный ресурс, чтобы тратить его на то, что можно автоматизировать Цитата D_KEY @ В любом случае - каша и никакого разделения между классами иерархии Это лютый бред, и он не выдерживает никакой критики. Точно так же можно заявить, что виртуальные методы в принципе создают кашу и отсутствие разделения между классами в иерархии. Ведь возможна гипотетическая ситуация, что ты перекрываешь виртуальный метод так, что он, будучи использованным в базовом классе который писал не ты, приведет к чему-то неожиданному и непредвиденному. Кто тебя знает, как тебе вздумается его перекрыть? И ты ведь не обязан знять реализацию базового класса. Вывод - надо запретить вызов виртуальных методов в базовом классе Еще раз: это полная хня. Единственная причина, почему в с++, Java, шарпе и т.д. пишут что не нужно вызывать вирт. методы в конструкторах - потому что там ты в случае чего не сможешь эту ситуацию разрулить. А в Delphi - сможешь, поэтому все сишные аргументы тут неприменимы |
|
Сообщ.
#7094
,
|
|
|
|
Цитата Shaggy @ поле всё равно удаляем, так напиши freeandnil(obj) вместо obj.free Многие Дельфисты даже помешались на этом FreeAndNil настолько, что используют даже для _локальных_ объектов, вроде:![]() ![]() var MyObj: TMyClass; begin MyObj := TMyClass.Create; try // do something with MyObj finally FreeAndNil(MyObj); end end; Спрашиваешь: зачем? Отвечают: мол, чтобы привыкнуть и в случае реальной необходимости не забыть Добавлено Цитата --Ins-- @ Еще раз: это полная хня. Единственная причина, почему в с++, Java, шарпе и т.д. пишут что не нужно вызывать вирт. методы в конструкторах - потому что там ты в случае чего не сможешь эту ситуацию разрулить. А в Delphi - сможешь, поэтому все сишные аргументы тут неприменимы Работал я когда-то над проектом, ядро для которого разрабатывал другой программист. Проект использовал табулированный интерфейс и ОЧЕНЬ часто вылетал при закрытии вкладок. А все из-за того что освобождение содержимого вкладки делалось в... BeforeDestruction! Вот посмотришь на такие примеры, и понимаешь, что не дураки все-таки Джаву разрабатывали Там таких проблем не может быть априори. |
|
Сообщ.
#7095
,
|
|
|
|
Цитата [S]mike @ Работал я когда-то над проектом, ядро для которого разрабатывал другой программист. Проект использовал табулированный интерфейс и ОЧЕНЬ часто вылетал при закрытии вкладок. А все из-за того что освобождение содержимого вкладки делалось в... BeforeDestruction! Ну дурак разработчик, Delphi то причем? Чьи-то кривые руки не делают инструмент, которые они держат, кривым. Я тебе могу привести примеры элегантного использования того же BeforeDestruction |