Форум 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=180728)

viktorami 07.06.2012 12:52

как избежать лишнего создания копии объекта?
 
пусть в главном классе создан экземпляр class1 в котором приуствует слушатель на собственное событие
Код AS3:

package   
{
    import flash.display.MovieClip;
    import flash.display.Sprite;
    import flash.events.*;
    public class lentW extends Sprite
    {
        public function class1() 
        {
 
        addEventListener("myCustomEvent", myCustomEventListener);
 
        }
        function myCustomEventListener(event:Event):void
        {
            trace("я услышал событие");
        }
    }
}

в этом же родительском классе создан экземпляр ДРУГОГО класса -class2 ИЗ которого я посылаю событие с помощью dispatchevent

Код AS3:

var lnt:class1=new class1();
 
        public function leftArrayClick(e:MouseEvent):void
        {
        lnt.dispatchEvent(new Event("myCustomEvent"));

class1 его слышит, однако для этого мне приходится создавать еще один его экзмпляр как видите. только для того чтобы отправить целевой dispatchEvent
как этого избежать?

Aquahawk 07.06.2012 12:56

ААААААА!! МОИ ГЛАЗА!!!

А если серьёзно, public function class1() это не класс, это функция. Вы видимо совсем запутались. Приводите весь код уж, я плохо понимаю что у вас происходит, второй кусок кода откуда вырван. Чего вы хотите добиться?
Изучать архитектурные вещи можно тщательно изучив синтаксис, вы его не знаете, признайте уже очевидное. Прочитайте Колина Мука уже.

Psycho Tiger 07.06.2012 12:58

Речь про экземпляр class1?
Вообще, всё плохо - события не стоит отправлять "кому-то", куда правильней рассылать от своего имени.

Если 3 класса - родительский, class1 и class2, то лучше всего перебросить событие через родителя вот так:
Код AS3:

a = new class1();
b = new class2();
a.addEventListener('event', b.handler);


viktorami 07.06.2012 13:13

все сделано для того, чтобы я мог вещать от одного класа- другому. задача стоит: чтобы один класс мог "сказать" напрямую другому- прими данные такие то и так далее.
как тогда это лучше сделать?

Добавлено через 2 минуты
без передачи в один класс(в конструктор) ссылки на другой класс, без использования того факта что все события дублируются на всех уровнях иерархии и оценки их через currenttarget
чтобы один класс мог сказать другому классу: сделай то то! вот, возьми эти данные.

КорДум 07.06.2012 13:17

Посмотрите на пост Тигры.
И классы в as3 не умеют рассылать события. А их экземпляры, если они наследуют все плюшечки EventDispatcher, да.

Короче, экземпляр class1 диспатчит событие, другой экземпляр, который имеет ссылку на этот экземпляр, ловит событие и вызывает хендлер у экземпляра class2, на который в свою очередь тоже имеется ссылка в общем, так сказать, "родителе".

Psycho Tiger 07.06.2012 13:19

Если Класс1 создал Класс2.
Классу1 нужно сказать что-то Классу2: напрямую дёргаем метод.
Код AS3:

class1:
 
a = new class2();
a.someMethod();

Класс2 нужно сказать что-то Классу1:
Код AS3:

class1:
 
a = new class2();
a.addEventListener('event', trace); //trace - какой-то хэндлер

Код AS3:

class2:
 
dispatchEvent(new Event('event'));

Важно: диспатч событий из конструктора делать нельзя, т.к. в принципе на момент выполнения конструктора у объекта ещё не может быть добавлен слушатель.

viktorami 07.06.2012 13:20

который имеет ссылку на этот экземпляр
-----------
а как получить внутри класса ССЫЛКУ НА ЭТОТ ЭКЗЕМПЛЯР??? вот в чем проблема!

Aquahawk 07.06.2012 13:20

viktorami
Приведите пожалуйста весь код который вы написали для этого теста, а то сейчас вся помощь строится на догадках.

Добавлено через 32 секунды
без ссылки нет взаимодействия, нет ничего плохого в передаче ссылок

КорДум 07.06.2012 13:22

В смысле "как"? Вы же не просто вызываете конструктор класса. А пишете вот так?
Код AS3:

a = new class1();

Ну "а" и будет ссылкой.

viktorami 07.06.2012 13:23

dispatchEvent(new Event('event'))

так не работает! уже пробовал. просто dispatchEvent не работает! должна быть указана его цель
targetclass.dispatchEvent(new Event('event'))

Добавлено через 1 минуту
КорДум вот - сразу видно умного и понимающего человека)
об этом и изначально была речь.
если так сделать - все работает!
но вопрос: получается у меня же class1 уже создан эземпляр - тот самый в котором и слушатель прописан
а теперь я вынужден создавать ЕЩЕ ОДНУ ЕГО КОПИЮ КОТОРАЯ БУДЕТ ЖРАТЬ РЕСУРСЫ - ДУБЛЬ КЛАССА
как же так???


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

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