Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Композиция: обращение вверх по иерархии (http://www.flasher.ru/forum/showthread.php?t=204193)

Psycho Tiger 09.11.2013 17:20

in4core, ну мы поняли что ты сделал поделку которая работает только в твоих сферических условиях и не способна для поддержки сторонними разработчиками. Ну так спрячь это подальше и никому не показывай – здесь нечем хвалится: ни кодом, ни подходом, ни конечным продуктом.

a7s1h1 14.11.2013 16:44

Тут ещё в самом начале было заявлено как аксиома, что ребёнок не должен обращаться к родителю. Но если, допустим, в определённый момент объект должен удалить себя из родителя, то в любом случае прийдётся к нему обращаться, если и не напрямую, то через собственное событие, которое будет слушать родитель. Но вместо того, чтобы специально для этого создавать специальное событие, распространять его из ребёнка и ловить в родителе, не лучше ли просто перед любым обращением к родителю проверять его наличие?
Код AS3:

if (parent) {
        parent.removeChild(this)
};


Dukobpa3 14.11.2013 16:50

Цитата:

в определённый момент объект должен удалить себя из родителя,
Ошибка закралась на этапе постановки задачи.
Ребенок НЕ ДОЛЖЕН удалять себя из родителя.
И если вдруг, по каким-то неведомым причинам (которых я не могу найти для этой ситуации, кроме как Венера попала в созвездие водолея или прилетели инопланетные поработители и помутили разум творящего сие добро), ребенок вдруг оказался должен это сделать. То возвращаемся к предыдущему пункту, соглашаемся с тем что ребенок ничего не должен, и ищем проблему выше.

А создавать специальных ивент не нужно. Всё, что нужно, это:
Код AS3:

dispatchEvent(new Event(READY_FOR_DELETION));


a7s1h1 14.11.2013 17:19

Цитата:

Сообщение от Dukobpa3 (Сообщение 1152375)
И если вдруг, по каким-то неведомым причинам ... ребенок вдруг оказался должен это сделать.

Ситуация следующая: появляется объект, постепенно за счёт изменения alpha "тает". Полностью растаяв, он должен исчезнуть.
Изменение alpha - в public function update(), которая каждый кадр вызывается из родителя.

Цитата:

Сообщение от Dukobpa3 (Сообщение 1152375)
А создавать специальных ивент не нужно. Всё, что нужно, это:
Код AS3:

dispatchEvent(new Event(READY_FOR_DELETION));


Разве есть такое встроенное событие? Я не нашёл.
Таким образом, выходит, что вместо короткого
Код AS3:

parent.removeChild(this)

в ребёнке, нужно будет создавать специальный класс для событий (событий детей этого родителя, например), из ребёнка распространять событие "папа, я умер", а в родителе слушать это событие, чтобы отреагировать и "убрать бездыханное тело" (прошу прощения за мрачные метафоры). "Так длиннее, но правильней?"

А заодно подскажите, пожалуйста, как удалить родителем ребёнка, занесённого в массив? Мучался с for (var i in array), но ничего не вышло.

Dukobpa3 14.11.2013 17:23

Понимаете ли вы разницу между строковой константой и новым событием?

Akopalipsis 14.11.2013 17:23

Цитата:

А заодно подскажите, пожалуйста, как удалить родителем ребёнка, занесённого в массив?
Всё очень просто - не нужно лирики, нужно уточнять.
Код AS3:

dispatchEvent(new Event(READY_FOR_DELETION));

Эта строчка не обязывает создавать не какие классы, она говорит лишь о том, что Вам необходимо почитать про события, так как Вы не знаете основ. А удалять ребёнка можно как event.target поймав событие.

Fogflasher 14.11.2013 17:49

«Нельзя затравить Мёртвого Лисёнка», холст-масло, Огюст Ренуар, 1884 ))))

***

А насчет удаления чилдренов, есть еще один вариант.
Допустим есть Parent, и у него Child1 и Сhild2. Нужно по событию в Child2 удалить Child1 из DisplayList.

Тогда можно завести отдельный класс и в его статическую функцию передать ссылки на экземпляры Parent и Сhild1, в которой будет parent.removeChild(child1).
Такой подход тоже работает, проверено на практике. Побочных эффектов замечено не было.

Судя по камментам из других тредов - этот подход менее правильный и грамотный, чем создание кастомного события.
Однако почему это так плохо - мне неизвестно. Может быть тогда больше проблем с GC.

Dukobpa3 14.11.2013 17:56

Это плохо, потому что нарушает один из главных принципов ООП - инкапсуляцию.
Так как этих принципов всего три: инкапсуляция, наследование, полиморфизм - то нарушить один из них == пересрать треть всех понятий ООП.

Три пункта запомнить и выполнять не сложно. Это понятие дисциплины, а никаких не понятий архитектуры или подходов к разработке.

Akopalipsis 14.11.2013 17:58

Цитата:

Судя по камментам из других тредов - этот подход менее правильный и грамотный, чем создание кастомного события.
А тут нет собственного события. В примере самое обычное событие.

a7s1h1 14.11.2013 18:01

Цитата:

Сообщение от Akopalipsis (Сообщение 1152380)
Эта строчка не обязывает создавать не какие классы, она говорит лишь о том, что Вам необходимо почитать про события, так как Вы не знаете основ. А удалять ребёнка можно как event.target поймав событие.

Читал, читал, ничего не вычитал(( С обычным событием у меня ничего не вышло, как ни пробовал.
Но у меня есть специальный класс для собственных событий - MyEvent:
Код AS3:

// класс для собственных событий
package RC {
 
        import flash.events.Event
 
        public class MyEvent extends Event{
 
                public var score:int;
                public var tar:uint;
                public static const GAME_OVER:String='GAME_OVER';
                public static const GAME_START:String = 'GAME_START';
                public static const BACK_TO_MENU:String = 'BACK_TO_MENU';
                public static const TRANSITION:String='TRANSITION';
 
                // CONSTRUCTOR (type)
                public function MyEvent(type:String, t:uint = 0, s:uint = 0) {
                        super(type)
                        tar = t;
                        score = s;
                };
        };
};

C помощью него без труда передам событие от ребёнка к родителю. Просто хотел узнать, лучший ли это путь. Ну, я так понял, что лучший. Буду манипулировать детьми через события.
Всем спасибо большое за советы!


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

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