![]() |
Композиция: обращение вверх по иерархии
Всем привет.
Вот здесь Wolsh вкратце описал принципы видимости свойств и методов. Однако, некоторые практические следствия из этого мне неочевидны. Рассмотрим на примере. Есть два класса ClassA (он же документ-класс), и ClassB. ClassA содержит в себе экземпляр ClassB, то есть получаем простейший пример композиции. ClassA.as: Код AS3:
Код AS3:
Цитата:
1. Обратиться из конструктора ClassB к свойству classA_sv1 (или методу classA_get()) класса ClassA. 2. Обратиться из конструктора ClassB к самому экземпляру ClassA. 1. По первой задаче, я пробовал в конструкторе ClassB вот такие строки: Код AS3:
2. По второй задаче, у меня что-то даже нет идей. Имя экземпляра документ-класса мы не знаем... Вероятно, нужны какие-то специальные приемы, типа оператора super(). |
Цитата:
Если же сильно приспичило обратиться к Документ-классу, и никакой нормальной архитектуры в голову не приходит, можете смело пользоваться ссылкой root из любого ДисплейОбжекта. |
Хм, оказывается здесь я допустил концептуальную ошибку, занятно.
Благодарю также за подсказку насчет .root, поэкспериментируем, тем более что "грамотная архитектура" наверное означает знание Program Patterns. Но на данный момент это не мой уровень, хотя некоторое самое общее представление о каждом у меня есть. Кстати, интересный вопрос: какой паттерн обычно получается у нубов (или хотя бы ближе всего по структуре), только начинающих юзать композиции и наследования? Или у тех кто пишет чисто в Main. Наверное все-таки Singleton. Добавлю, что пример в этом посте взят не с потолка, а с одной моей тестовой разработки, где кнопка внутри главного дисплейного контейнера должна "очистить стэйдж", то есть грубо говоря, удалить этот контейнер, в котором находится и она, и другие чилдрены. В таком случае не понятно как можно повесить обработчик на кнопку так, чтобы можно было удалить его вместе со всем содержимым, включая и эту кнопку. |
Код AS3:
|
Цитата:
Почему она в данном контексте связывает, ведь она не чего не знает о родителе. И как тогда делать? Ловить в MainView клик от кнопки и обрабатывать как родителю хочется? |
Цитата:
Цитата:
UDP: Сможете ли вы это кнопку использовать в какой-то другой программе? Нет, потому что она завязана с другим классом, может быть и косвенно. Кнопка должна выполнять функции кнопки, не более того. По крайней мере тут. |
Цитата:
Если родителю нужно, он подписывается на события от ребенка. Таким образом ребенок может сказать "Папа, меня Вася побил!" и папа примет решение на основании своих соображений. Создавать ситуацию, когда ребенок требует "Папа.убей(Васю)" нарушает самые примитивные представления об иерархии. Всегда родитель распоряжается ребенком, никогда наоборот. Родитель создал ребенка для решения каких-то своих задач, ребенок не должен знать ни этих задач ни своего родителя. Должен просто хорошо делать свою работу, а родитель должен предоставить ему все необходимое для этой работы при создании или, по крайней мере, до того как требовать результат. Добавлено через 6 минут Кнопка не может содержать в себе код, делающий что-то не с кнопкой или ее детьми. Никогда. "Кнопка" это то, что нажимается, а не то, что удаляет все объекты со стейджа. Все, что должна уметь кнопка — нажиматься. Такую кнопку можно использовать в любом проекте, потому что она просто делает СВОЮ работу. Разносить логику, касающуюся всех, по всем мелким детишкам проекта еще хуже, чем писать код в отдельных кадрах мувиклипов. |
А для чего новое событие изобретать?
|
Цитата:
|
В MainView подписывайтесь на MOUSE_DOWN. Из кнопки убирите обработчик.
|
А если кнопок будет много ( как например калькулятор ) это Вы предлагаете для каждой писать слушателя, в место наследования от класса у которого всё уже прописано? я не согласен.
|
Ну так вы же в итоге всё равно подписываетесь, только на другое событие.
Цитата:
|
udaaff Спасибо за обьяснения!
Хотя ещё можно и destroy сразу вызывать. Код AS3:
Код AS3:
Код AS3:
Код AS3:
|
Wolsh, ясно, значит обращение вверх по иерархии вообще ересь, и нужно менять архитектуру.
Akopalipsis, о как интересно, благодарю за пример. Чуть позже попробую протестировать, но уже при беглом осмотре имеется пара вопросов. Но пока только хотел спросить, а что это за подход такой с MainView, почему вы его в диалоге с udaff использовали как отдельный термин? Это часть какого-то Паттерна? Может у вас тут вообще MVC реализовано. |
Обращение вверх по иерархии не ересь. Допустим если у вас одинаковое содержимое в разных контейнерах. Я для этих целей использую сами знаете что.
|
Цитата:
отображение, он создаёт и обрабатывает только визуальные обьекты. Когда мне в первые показали такой вариант, то я его боялся и не использовал очень долго. Но сейчас я не даже представить не могу, что буду использовать другую реализацию. Цитата:
|
Цитата:
Мало того, если _button член класса, как в данном коде, id вообще не нужен. Код AS3:
|
Вот я и говорю, что destroy можно сделать слушателем.
|
У меня есть dict[node.@id]=class
|
Akopalipsis, разбираю ваш пример, идея прикольная, но и вопросов много )
1. Код AS3:
А разве по умолчанию оно и не будет равно null? Или тут есть какой-то ньюанс... 2. Код AS3:
Я понимаю его так: Создать экземпляр класса AppConfig и передать ему экземпляр класса Main. Правильно ли это? И кстати, это пример Композиции? Видимо это пример "Недокомпозиции", так сказать... Ведь мы этот оператор не присваиваем никакой переменной, то есть экземпляр завис в воздухе. 3. Код AS3:
И именно для этого писали new AppConfig(this); то есть передача через конструктор обязательна. И по другому нельзя. 4. Код AS3:
Однако потом увидел, что ваш четвертый класс имеет такое же имя... Это смущает. То есть, выходит, создав свой класс Button мы как бы оттенили системный класс с таким же именем. Этакий классовый оверрайд? 5. Код AS3:
Или это какой-то трюк, типа, мы можем налету присобачить к экземпляру любые свойства? 6. Код AS3:
Применили к текущему экземпляру класса MainView метод destroy, который обратился к экземпляру класса выше (то есть super. это ссылка на Main, ведь так?), и удалил всех его детей. Выходит, это всё равносильно записи: this.super.removeChildren(); 7. Код AS3:
Это равносильно записи new Sprite(); так чтоли? Но даже если так, то экземпляр завис в воздухе, и мы его потеряли. Тогда "... зачем ей все шелка?" (с) 8. Функции get и set, в связке со свойством _id, они несут какую-то функциональность в данном примере? Похоже что нет... Видимо добавлены для "цельности концепций", поправьте, если это не так. 9. Вы проверяли этот проект на работоспособность? А то при запуске я получаю одну ошибку: Цитата:
|
Зачем Вы разбили детские мечты об идеальном коде?
|
Babylon,
Цитата:
Цитата:
Цитата:
|
Цитата:
Цитата:
Цитата:
Цитата:
Можно, как Вы хотите так и можно. я просто показал как делает большинство. Цитата:
Цитата:
Цитата:
super === наследуемый Цитата:
Цитата:
Код AS3:
Добавлено через 4 минуты Fogflasher я тоже мало чего знаю, но я всегда слушаю советы, Вам нужно Мука почитать. Вот есть у Вас вопрос - что такое super, открыли и посмотрели. Не поняли, спросили. я тоже уже кучу книг прочёл, но пока мне не скажут, что надо так! меня сомнения гложут. Добавлено через 6 минут Babylon на самом деле, я Вас теперь понимаю и понимаю Ваше слова про ядро. Странно что Вас другие не понимали. |
Цитата:
Цитата:
Цитата:
Цитата:
Учитывая, что на дворе уже версия 11.9, может пора перестать компилить под десятку? |
Цитата:
|
Цитата:
|
Всецело поддержываю идею подчинения детей родителю, но это всего лишь рекомендация, которая неимоверно облегчает жизнь разработчика чегото посложнее рекламных баннеров. Но... не стоит забывать, что ребенок в состоянии управлять родителем (дай только ссылку компрометирующую). Попробуйте без такого еретического подхода развернуть ролик на весь экран или поменять режым скалирования/выравнивания сцены.
Конечно, можно все списать на бедолаг-индусов и их проделки, но имеем то, что имеем :/ |
Ну так это Stage. У него нет родителя и сам он не расширяется, так что командовать им могут только дети, как ни крути.
|
Akopalipsis,
Цитата:
Цитата:
Отнюдь нет. Просто иногда приятнее спросить, нежели ковыряться в документации. Возможно я переборщил здесь. Цитата:
Цитата:
Я имел ввиду: это свойство системное, ну типа x, или buttonMode, или созданное рукотворно, но "на лету", без объявление где либо еще. Цитата:
Цитата:
Wolsh, Цитата:
И если нет, то можно ли как-то из библиотеки мувики экспортировать/передать в более старшую версию. |
Цитата:
|
udaaff, то есть практически, его можно и не писать... хорошо, но вообще, замысел этой вставки в чем?
Просто дань традиции? Типа "раньше так было нужно, теперь уже нет, но почтим Велеса". |
Если вы не вызовите super() в конструкторе, компилятор это сделает за вас, но добавит этот вызов в самое начало конструктора.
super() имеет смысл вызывать если вы хотите что-нибудь сделать до того как вызовется конструктор супер-класса. |
AlexLucas, о как, интересно, но ведь в коде:
Код AS3:
И, если я вас правильно понял, здесь он нефункционален. А вот если его поставить после if(stage)... то получается, что сначала выполнится if, а потом уже наш super(); и в этом есть уже некий замысел. (просто проговорю вслух, чтобы закрепить: наличие рукописного super'a автоматически отменяет запуск призрачного системного супера). |
|
AlexLucas а почему в примере выше, вызов конструктора супер класса, не функционально? Разве до вызова конструктора может появится стейдж?
|
Что с super() что без супер в том случае всё равно, я же написал
Код:
Если вы не вызовите super() в конструкторе, компилятор это сделает за вас, но добавит этот вызов в самое начало конструктора. |
Цитата:
Так что-же получается, в нашем кустомном классе Button вообще не должно быть никаких листенеров, вообще ничего? Ну максимум, координаты, размеры, имя экземпляра, и всё... Выходит, на весь проект (типа: ГУИ-интерфейс), должен быть некий единый глобальный слушатель, который находится в мега-родителе. И он уже отсеивает по свойствам e.target (и другим), нужные действия? И если ребенок чего-то хочет, то единственный (грамотный) способ - это сгенерировать в нём кустомное событие, которое всплывает вверх к родителю? А разве это не означает, что такие дети должны наследоваться от EventDispatcher, а не от Sprite, то есть они теряют доступ к свойствам последнего, что плохо : ) |
Цитата:
Цитата:
Цитата:
|
Wolsh, спасибо, пока вопросов нет.
Вобщем, делаю вывод, что слушатели можно вешать повсюду, но всегда на уровень выше, чем прослушиваемый объект. С генерацией кастомных событий не приходилось иметь дело, так что пока имеется неуверенность в этом вопросе. Но то, что доступ вверх - от детей к родителям, должен происходить только посредством них, уже проясняет направленность в изучении этой темы. |
Wolsh, ты предлагаешь каждому контейнеру или виду иметь список слушателей?
|
| Часовой пояс GMT +4, время: 15:36. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.