![]() |
обращение сразу ко всем экземплярам определенного класса
Всем привет!
У меня вот такой вопрос: Можно ли, каким-то образом, обратиться сразу ко всем экземплярам определенного класса, которые отображены на сцене? |
Пройтись по каждому экземпляру и проверить, является ли он наследником определенного класса, с помощью оператора is
|
Обратиться к экземпляру класса, можно только имея ссылку на него.
Т.е. вам необходимо сделать статическое "хранилище" ссылок на экземпляры этого класса и при создании экземпляра (в конструкторе) заносить ссылку на экземпляр в хранилище. Для оптимизации и возможности удаления объектов, ссылки можно сохранять по ADDED и удалять по REMOVED. |
если я правильно понял то возможно вам будет интересно посмтреть в сторону либо наблюдателя или
компоновщика |
3p.station, в данной задаче это перегиб
|
можно
например в конструкторе регистрировать экземпляр в каком нибудь статичном массиве. Код AS3:
|
люди, какой наблюдатель? Какое регистрить? Все гениальное - просто, а сложное - не нужно.
Код AS3:
|
ну это во первых только если все экземпляры находятся в одном контейнере
во-вторых, смысл перелопачивать дохерища объектов (а их может быть еще больше:) ), когда можно взять только нужное? Ну и рекурсия тут явно не оправдана |
Цитата:
Цитата:
Вывод - первый способ реализуем с меньшим гимором и он не может привести к утечкам памяти, в то время как во втором способе, можно "забыть" удалить экземпляр из статик массива, когда объект станет ненужным. |
i.o., зачем перелопачивать ВСЕ, когда можно иметь список нужного? Нет желания использовать статик - юзаем сингл. А если соответствующему классу (экземпляру) при добавлении на сцену прописать автоматическое добавление в массив (напр. метод register), а удалять другим методом (к примеру destroy), удаляя его при этом из соответствующего массива. Думаю что это более привлекательное решение.
|
Цитата:
|
Не вижу смысла отягощать дополнительными функциями класс, заморачиваться на слушание событий типа ADDED_TO_STAGE / REMOVED_FROM_STAGE. Хранить это все еще где-то. Когда задача поставлена предельно просто и ясно: перебрать все объекты на сцене определенного класса. Зачем вот надо придумывать лишнее, когда конкретно в данном случае можно обойтись одной-единственной функцией. А для гибкости, можно класс динамически подсовывать:
Код AS3:
Код AS3:
Автор не ставил задачу "максимально быстро", где возможно было бы оправдано пихать лишний функционал в кастомные классы. Приведенный пример максимально гибок / абстрактен и может быть использован независимо от реализации кастомных классов. |
@i.o.:
а если объекты искомого класса находятся внутри другого объекта находящегося на сцене, предлагаете рекурсивно бегать по всем DisplayObjectContainer'ам? |
mayakwd, а что у вас на сцене тысячи объектов валяются, что это может сказаться на переборе, даже рекурсивном? Если да, то постом выше сказано:
Цитата:
|
@i.o.:
я считаю что код должен быть продуктивным, и, что не стоит делать частных решений. |
i.o., не было задачи "перебрать все элементы", была задача "выбрать нужные". А ваш вариант хоть и имеет правл на жизнь, но вданном контексте ИМХО менее "ООПшный", мы же не gc пишем.
|
Вот статик массив, как раз, есть частное решение. То что я предложил - общее.
TanaTiX Если вам платят за количествно набранных строк и за "только ООПшный код", а не за здравый взгляд на мир вещей, то я понимаю ваше несогласие. |
Цитата:
Так как условия и цели в разных случаях могут различаться, не бывает универсального кода. |
Цитата:
вырвать из контекста можно что угодно ) |
Цитата:
В упрощенном виде тест такой: Код AS3:
Как же непродуктивно!... :p:p |
подобные тесты не дают никаких реальных данных B-)
тем более глубина вложенности у вас равна единице =) |
вам двести тысяч детей о чем-то говорит? Это сделано с учетом того, что в реальности даже во всем древе сцены столько детей никогда не будет. Но даже при такой тяжести все про все отнимает 35 мс. С рекурсивным проходом в два раза медленнее не станет, поверьте.
Можете стоять на своем, мне до этого дела нет. Вообще, рекоммендую поинтересоваться у автора - ему это для авариума с рыбкой нужно? |
ну кучу хороших вариантов названо.
в зависимости от случая можно и пройтись по всем обьектам(количество их может быть слишком большим) или юзать один из названных патернов(большой минус возможность утечьки памяти ведь при удалении обьекта отовсюду на него еще останется ссылка из храниша. а в большом проекте перекопать все места где удаляются обьекты может быть не так просто). у меня только один вопрос. почему Код AS3:
Код AS3:
Добавлено через 11 минут тьфу. я чето только первую страницу прочитал подумал на этом и остановились :)))))) 200 тысяч за 35 милли секунд это бычтро. очень даже по моему. не ожидал |
ну вообще я как и tanatix советую помещать объекты в массив при создании, без всяких статиков итп...
типа так: Код AS3:
|
Код AS3:
Это недостаток дизайна. Было бы удобно, если бы под последним комментарием была достаточно заметная кнопка "СЛЕДУЮЩАЯ СТРАНИЦА", если такая есть. |
Задача:
Цитата:
Цитата:
Добавка от passertm: Цитата:
Мнение mayakwd: Цитата:
|
Вы тут спорите ни о чем. Главное - идея. Идеи подкинули -- дальше пускай топикстартер сам решает что ему нужно.
может ему нужно перебирать эти экземпляры 1 раз при запуске. А может в каждом событии ENTER_FRAME. Требования к оптимизации, естественно разные. |
Цитата:
Добавлено через 25 часов 28 минут Цитата:
я не пытаюсь показать будто этот метод сложнее чем есть на самом деле. наличие нужных событий очень упрашает дело. но все же есть случаи в которых я бы предпочел делать перебор. ибо игра не стоилобы свечь(реализации этого всего и отладки чтобы убедиться что все идет как надо) |
Цитата:
Цитата:
|
Цитата:
|
Цитата:
Цитата:
я повторюсь я не говорю что ваш метод плох. и есть много случаях когда я бы использовал и его. просто мое сугубое личное мнение(с языков в которых подобная реализация не так проста) что с подобными кодами лучше быть осторожнее) |
Форум не без людей, которые пишут ООП ради ООП, даже если тем, что они пишут, нужно воспользоваться один раз.
Добавлено через 21 минуту Да и вообще весь спор глупый. Автор не уточнил ситуацию. Что из себя представляет сцена? Добавлена ли она на стейдж? Как часто он собирается проходить по всем объектам определенного класса? Что из себя представляет определенный класс? Может это обычные Sprite, Shape, MovieClip и Bitmap. Тогда вы предлагаете контейнеру-сцене подписываться на фазу захвата для событий ADDED / REMOVED, чтобы добавить / удалить объект из списка? Если определенных классов используется несколько, то на каждый вести список? Поэтому, прежде чем отстаивать ту или иную точку зрения, нужно вначале выяснить все детали ситуации, а потом уже решать, что оптимальнее всего подходит. |
Цитата:
Цитата:
|
Цитата:
|
i.o., согласен, уже пошла сплошная демагогия :)
|
я тоже согласен, но вы меня задели за живое - приведите пример головной боли))
|
Цитата:
любопытно. для обьектов которые были добавлены в гуях влеша а не программным путем вызываются событий ADDED |
Топикстартер сделал вброс и пропал)
Давайте может закругляться? По вопросу более-менее ответили.. |
Цитата:
Встречный вопрос, какова головная боль при добавлении / удалении объектов в статический список, с последующей обработкой или обработкой в процессе добавления / удаления? |
Цитата:
Зато в конкурирующем примере, где слушается ADDED_TO_STAGE / REMOVED_FROM_STAGE, получится: Цитата:
Цитата:
В общем спорить бесполезно о том какая реализация лучше - читай выше. |
| Часовой пояс GMT +4, время: 14:14. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.