Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 15.05.2018, 01:26
djken вне форума Посмотреть профиль Отправить личное сообщение для djken Посетить домашнюю страницу djken Найти все сообщения от djken
  № 1  
Ответить с цитированием
djken
 
Аватар для djken

Регистрация: May 2010
Адрес: Краснодар
Сообщений: 182
Отправить сообщение для djken с помощью ICQ Отправить сообщение для djken с помощью Skype™
Question Как правильно расширить класс?

Привет всем.
Подскажите пожалуйста как сделать правильно.
Есть класс ImageBox - некий контейнер, которому можно задавать размеры, в себя умеет загружать картинку и пустое место заполнять выбранным фоном.

От этого класса будут производные классы. Например, класс ImageBoxExt - делает все тоже самое что и ImageBox, но еще при наведении должны внутри появляться кнопка корзины и чекбокс.




Наследоваться от ImageBox?
Код AS3:
public class ImageBoxExt extends ImageBox
Проблема: в конструкторе после super добавляю кнопку корзины и чекбокс. Но после того как загружается основная картинка, она закрывает все новосозданные кнопки ) Следовательно, в этом классе нужно перекрывать родительские методы - а это неправильно.

Либо просто создавать класс, наследуясь от Sprite и внутри создавать экземпляр класса ImageBox?
Код AS3:
public class ImageBoxExt extends Sprite
{
   private var _ib:ImageBox;
...
   _ib = new ImageBox(...);
   addChild(_ib);
   // и тут добавлять новые кнопки
...
}
__________________
кто не отвечает, того garbage collector забирает


Последний раз редактировалось djken; 15.05.2018 в 01:42.
Старый 15.05.2018, 02:58
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 2  
Ответить с цитированием
undefined

Регистрация: Oct 2006
Сообщений: 2,281
Цитата:
Следовательно, в этом классе нужно перекрывать родительские методы - а это неправильно.
Почему?

Старый 15.05.2018, 08:38
djken вне форума Посмотреть профиль Отправить личное сообщение для djken Посетить домашнюю страницу djken Найти все сообщения от djken
  № 3  
Ответить с цитированием
djken
 
Аватар для djken

Регистрация: May 2010
Адрес: Краснодар
Сообщений: 182
Отправить сообщение для djken с помощью ICQ Отправить сообщение для djken с помощью Skype™
Undefined, почему нужно перекрывать? Или почему это неправильно?

Перекрывать нужно, т.к. надо ловить момент загрузки картинки, что бы потом остальное дорисовывать сверху. Либо менять слои местами. Следовательно, нужны изменения в методах родительского класса.

А неправильно, т.к. это нарушение инкапсуляции..
__________________
кто не отвечает, того garbage collector забирает

Старый 15.05.2018, 10:06
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 4  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Следовательно, в этом классе нужно перекрывать родительские методы - а это неправильно.
Неправильно? Это один из принципов ООП, так сказать, один из трёх китов)
Цитата:
А неправильно, т.к. это нарушение инкапсуляции..
Нет, это неправильная архитектура изначально.

Если изначально планируется, что в базовом классе грузится какая-то картинка, а объекты дочерних классов должны знать об этом, то и архитектуру родительского класса надо делать сразу с учетом этого.
Если нужно дождаться загрузки картинки, то можно обработчику сделать модификатор protected и в дочернем классе просто его перезаписать
Код AS3:
// в базовом классе
protected function onImageLoaded(e:Event):void {
      ... добавляется картинка
}
// в наследнике
override protected function onImageLoaded(e:Event):void {
    super.onImageLoaded(e);
    .. тут добавляешь свои чекбоксы
}
Я бы вообще добавление чекбоксов вынес из конструктора в отдельный метод, и просто вызывал его после загрузки картинки
Код AS3:
override protected function onImageLoaded(e:Event):void {
    super.onImageLoaded(e);
    addCheckboxesAndOtherCrap();
}
как-то так
__________________
Ко мне можно и нужно обращаться на ты)

Старый 15.05.2018, 13:55
djken вне форума Посмотреть профиль Отправить личное сообщение для djken Посетить домашнюю страницу djken Найти все сообщения от djken
  № 5  
Ответить с цитированием
djken
 
Аватар для djken

Регистрация: May 2010
Адрес: Краснодар
Сообщений: 182
Отправить сообщение для djken с помощью ICQ Отправить сообщение для djken с помощью Skype™
caseyryan, спасибо большое!
Для личного пользования всегда обходился только private и public. Но в данном случае не хотелось использовать public у родительского метода для перезаписи в наследнике, т.к. onImageLoaded не относится к интерфейсу данного класса.

Теперь буду знать про protected )

Цитата:
то и архитектуру родительского класса надо делать сразу с учетом этого
Но все же - какая в данном случае архитектура была бы правильная? Или имелось ввиду использование protected?
__________________
кто не отвечает, того garbage collector забирает

Старый 15.05.2018, 14:19
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 6  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Но все же - какая в данном случае архитектура была бы правильная? Или имелось ввиду использование protected?
Правильно в данном случае - иметь возможность уведомить наследников о загрузке картинки.
Цитата:
Теперь буду знать про protected )
protected это всего лишь один из 4 штатных модификаторов доступа, означает доступ для наследников. Есть еще internal для свойств доступных внутри пакета. Можно и свое пространство имен объявить, но тут это избыточно
__________________
Ко мне можно и нужно обращаться на ты)

Старый 15.05.2018, 14:37
djken вне форума Посмотреть профиль Отправить личное сообщение для djken Посетить домашнюю страницу djken Найти все сообщения от djken
  № 7  
Ответить с цитированием
djken
 
Аватар для djken

Регистрация: May 2010
Адрес: Краснодар
Сообщений: 182
Отправить сообщение для djken с помощью ICQ Отправить сообщение для djken с помощью Skype™
А, ну у меня в родительском методе вконце стоит диспатч события после загрузки картинки.
Код AS3:
dispatchEvent(new Event('COMPLETE'));
Получается я могу его так же в наследнике слушать.. я что-то не додумался сразу до этого )
Код AS3:
super.addEventListener('COMPLETE', onCompleteHandler);
...
 
private function onComplete(e:Event):void
{
	var _cb:CheckBox = new CheckBox();
	addChild(_cb);
}
Значит можно без override обойтись )
Пасиб! )
__________________
кто не отвечает, того garbage collector забирает

Старый 15.05.2018, 14:47
GBee вне форума Посмотреть профиль Отправить личное сообщение для GBee Найти все сообщения от GBee
  № 8  
Ответить с цитированием
GBee
 
Аватар для GBee

Регистрация: Jan 2009
Сообщений: 3,067
Записей в блоге: 3
Отправить сообщение для GBee с помощью Skype™
Так может картинку на 0 уровень всегда пихать после загрузки?
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку.

Старый 15.05.2018, 17:26
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 9  
Ответить с цитированием
undefined

Регистрация: Oct 2006
Сообщений: 2,281
Цитата:
Значит можно без override обойтись
Тебе явно кто-то вбил в голову,что override - это плохо.Это не так.

Старый 15.05.2018, 17:28
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 10  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Сообщение от djken Посмотреть сообщение
А, ну у меня в родительском методе вконце стоит диспатч события после загрузки картинки.
Код AS3:
dispatchEvent(new Event('COMPLETE'));
Получается я могу его так же в наследнике слушать.. я что-то не додумался сразу до этого )
Код AS3:
super.addEventListener('COMPLETE', onCompleteHandler);
...
 
private function onComplete(e:Event):void
{
	var _cb:CheckBox = new CheckBox();
	addChild(_cb);
}
Значит можно без override обойтись )
Пасиб! )
Ну, во-первых писать типы событий хардкодом типа "COMPLETE" - это моветон. Можно легко опечататься и потом думать и гадать, почему не работает. Всегда используй для этого константы.
Во-вторых, для события complete есть штатная константа Event.COMPLETE, даже свою объявлять не надо
Ну и в третьих - отправка события - это всегда более ресурсоемкий способ, чем вызов метода. У тетя там и так событие приходит при загрузке картинки. Создавать еще одно - это оверхэд. Оверрайд в данном случае более правильный подход. Не нужно ни слушателей дополнительных ни событий и всё по ООПшному
А если событие все-таки нужно для чего-то ещё, то ты можешь не создавать новое, а просто передиспатчить то же
Код AS3:
dispatchEvent(e);
__________________
Ко мне можно и нужно обращаться на ты)

Создать новую тему Ответ Часовой пояс GMT +4, время: 15:33.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 15:33.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.