Как правильно расширить класс?
Привет всем.
Подскажите пожалуйста как сделать правильно. Есть класс ImageBox - некий контейнер, которому можно задавать размеры, в себя умеет загружать картинку и пустое место заполнять выбранным фоном. От этого класса будут производные классы. Например, класс ImageBoxExt - делает все тоже самое что и ImageBox, но еще при наведении должны внутри появляться кнопка корзины и чекбокс. http://www.flasher.ru/forum/attachme...chmentid=33228 Наследоваться от ImageBox? Код AS3:
Либо просто создавать класс, наследуясь от Sprite и внутри создавать экземпляр класса ImageBox? Код AS3:
|
Цитата:
|
Undefined, почему нужно перекрывать? Или почему это неправильно?
Перекрывать нужно, т.к. надо ловить момент загрузки картинки, что бы потом остальное дорисовывать сверху. Либо менять слои местами. Следовательно, нужны изменения в методах родительского класса. А неправильно, т.к. это нарушение инкапсуляции.. |
Цитата:
Цитата:
Если изначально планируется, что в базовом классе грузится какая-то картинка, а объекты дочерних классов должны знать об этом, то и архитектуру родительского класса надо делать сразу с учетом этого. Если нужно дождаться загрузки картинки, то можно обработчику сделать модификатор protected и в дочернем классе просто его перезаписать Код AS3:
Код AS3:
|
caseyryan, спасибо большое!
Для личного пользования всегда обходился только private и public. Но в данном случае не хотелось использовать public у родительского метода для перезаписи в наследнике, т.к. onImageLoaded не относится к интерфейсу данного класса. Теперь буду знать про protected ) Цитата:
|
Цитата:
Цитата:
|
А, ну у меня в родительском методе вконце стоит диспатч события после загрузки картинки.
Код AS3:
Код AS3:
Пасиб! ) |
Так может картинку на 0 уровень всегда пихать после загрузки?
|
Цитата:
|
Цитата:
Во-вторых, для события complete есть штатная константа Event.COMPLETE, даже свою объявлять не надо Ну и в третьих - отправка события - это всегда более ресурсоемкий способ, чем вызов метода. У тетя там и так событие приходит при загрузке картинки. Создавать еще одно - это оверхэд. Оверрайд в данном случае более правильный подход. Не нужно ни слушателей дополнительных ни событий и всё по ООПшному А если событие все-таки нужно для чего-то ещё, то ты можешь не создавать новое, а просто передиспатчить то же Код AS3:
|
Цитата:
Цитата:
Код AS3:
Код AS3:
Код AS3:
|
Цитата:
Код AS3:
|
caseyryan, огромнейшее спасибо за помощь!
|
Наконец-то сел почитать, чтобы разобраться с Событиями досканально - многое прояснил для себя.
Но есть момент, в котором не знаю как правильно поступить: как раз столкнулся на моем примере, когда по совету от caseyryan стал не создавать свое новое событие, а передиспатчивать существующее - dispatchEvent(e). Мне нужно ловить событие клика по спрайту _box, который внутри класса ImageBox. Код AS3:
Код AS3:
Как я понимаю: ImageBox имеет событие click, унаследовав от Sprite. И _box тоже. Подписавшись на событие click у _imageBox - из-за цепочки событий в иерархии отображаемых объектов на фазе захвата происходит диспатч сначала у предка [object ImageBox], а потом и у получателя [object Sprite]. Верно ли понимаю? Вопрос: мне не нужно чтобы onClick срабатывал дважды, т.к. в нем будут производиться какие-либо действия дважды.. Вижу два выхода: 1) в обработчике проверять от кого пришло событие и только после этого выполнять дальнейшие действия. 2) либо все таки в onClickHandler диспатчить свое событие. Подскажите пожалуйста. |
dispatchEvent диспатчит клон события,поэтому перед посылкой оригинальное событие надо остановить через stopImmediatePropogation.
|
От задачи же зависит..
Если вам надо событие клика по КАРТИНКЕ, но к самой картинке доступа нет и добавить ей слушатель нельзя, то придется диспатчить от имени контейнера и тогда да, лучше использовать кастомное событие. То есть обычный Event, но со "своим" строковым типом, который можно объявить константой в классе ImageBox, пусть будет ImageBox.CLICK_IMAGE. Код AS3:
Код AS3:
|
Цитата:
Код AS3:
Код AS3:
Код AS3:
undefined, попробовал stopImmediatePropogation, работает. Но не совсем понимаю, что значит dispatchEvent диспатчит клон? В справке Adobe ничего не нашел про stopImmediatePropogation. Упоминается вскользь... Цитата:
|
Цитата:
Код AS3:
|
undefined, теперь понял! Огромное спасибо за разъяснение!
|
Цитата:
Цитата:
|
Wolsh, понял ) Благодарю за исчерпывающий ответ!
|
Часовой пояс GMT +4, время: 20:22. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.