![]() |
Правильное межклассовое взаимодействие
Давно мучаюсь следующим вопросом
В экземпляре класса А создан экземпляр класса Б, как из экземпляра класса Б обратиться к свойствам и методам класса А? Можно просто, создавая экземпляр класса Б, передать ему ссылку на класс А, однако, тут на форуме я читал, что так делать не правильно, что нужно передавать экземпляру параметры, а получать от него события. В таком случае, пример: В экземпляре класса А создан экземпляр класса Б, в экземпляре Б создан экземпляр класса С. Из класса С необходимо обратиться к методу класса А, для этого в классе С вызываю событие, обрабатываю его в классе Б, затем в классе Б вызываю событие и уже его обрабатываю в классе А. Сложновато как-то, да и громоздко. Может я что-то неправильно понимаю? |
Посылая события вместо прямого обращения вы просто разрываете жесткую связь с классом A, т.е. была двунаправенная - стала однонаправленная
Зачем? Вот у вас есть компонент кнопка с названием B, по нажатию на нее должно что-то произойти в классе А, и че, вы напрямую в классе кнопки вызываетет метод А? Тогда вы точно нигде эту кнопку не сможете задействовать, кроме как в классе А Тоже самое и со всем остальным - это не чтобы усложнить жизнь, а чтобы разорвать связи, мешающие повторно использовать компоненты Компонент должен говорить отсылкой события что с ним случилось, а не что нужно сделать в хрен знает каком классе ...Вообще фанатизм тоже не нужен. Часто лучше просто ссылку в конструктор передать. Цитата:
Может им 3-м создать один общий класс (медиатор), через который они будут общаться или который будет ими рулить P.S. Лучше приведите конкретный пример, а то слишком обстрактно получается :( |
Jin 2,
События всплывают по иерархии. Не надо их десять раз обрабатывать. Относительно примера, когда по событию в объекте D нужно что-то делать в объекте А: - объект А - контроллер - объект В - локация - объект С - перс в локации - объект D - контекстное меню, которое всплыло по клику на перса, с кнопкой, по которой нужно закрыть текущую локацию, открыть новую и поместить туда перса В итоге: - обрабатываем в объекте D кнопку контекстного меню, пакуем в событие информацию для контроллера и отправляем наверх. - объект А (контроллер) получает событие, закрывает текущую локацию, открывает новую и помещает туда перса об этом речь? Ну а если нужно что-то более простое и неправильное, то используйте parent. Тут периодически проходят даже куски кода вроде Код AS3:
|
В том-то и дело, хочется сделать не так как раньше, а по уму.
Цитата:
в контекстном меню кнопка, так вот как отправить событие в класс А, если D в С, С в B а B в А? Провести событие через все классы? Или экземпляры этих классов создавать в контролере, а не друг в друге? В итоге получается, что в контроллере должны быть обработчики почти всех событий, которые происходят в игре? |
баблинг
|
Jin 2,
- объекты вкладывать друг в друга через addChild() - баблинг (пузырьковое всплытие) обеспечить установкой свойства bubbles в true http://help.adobe.com/ru_RU/AS3LCR/F...t.html#bubbles - относительно большого количества событий беспокоиться не стоит, поскольку событий будет немного (при правильной организации процесса). Например, все возможные перемещения перса между любыми локациями - это одно событие, просто с разными параметрами. |
Получается код должен быть примерно таким?
Код AS3:
|
нет, не совсем ))
ключевое - событие диспатчится (генерируется) на нижнем уровне, а слушается на верхнем. Но именно так писать нельзя. Добавлено через 21 минуту Вот, как-то так. Работоспособность не проверял, но должно работать 1. Наверху создаем локацию и ставим слушателя. AppEvent - это собственный класс события, позволяющий передавать параметры. Код AS3:
Код AS3:
Код AS3:
Код AS3:
|
Большое спасибо!
|
| Часовой пояс GMT +4, время: 00:31. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.