Форум 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 уже создан эземпляр - тот самый в котором и слушатель прописан
а теперь я вынужден создавать ЕЩЕ ОДНУ ЕГО КОПИЮ КОТОРАЯ БУДЕТ ЖРАТЬ РЕСУРСЫ - ДУБЛЬ КЛАССА
как же так???

КорДум 07.06.2012 13:24

Цитата:

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

viktorami 07.06.2012 13:29

без ссылки нет взаимодействия, нет ничего плохого в передаче ссылок
как же ничего плохого, когда я создаю копию полную копию класса всего лишь для того чтобы отправить целевой dispatch

Hauts 07.06.2012 13:31

Копия != Ссылка

Aquahawk 07.06.2012 13:32

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

Psycho Tiger 07.06.2012 13:32

Цитата:

так не работает! уже пробовал. просто dispatchEvent не работает! должна быть указана его цель
Если ничего не указано - подразумевается контекст this. Значит, твой класс не наследуется от EventDispatcher'a.

И вообщем, я умываю руки.

КорДум 07.06.2012 13:52

Класс != копия. Класс - это просто код, описывающий поведение экземпляра. Ну и может иметь статичные методы класса, но сейчас речь не об этом.
Пока Вы не создали экземпляр класса, сам класс никакой своей жизнью жить не будет. Он точно так же, как и все другие - просто будет находиться в памяти в виде байткода и ждать своего часа, когда интерпретатор заглянет в него и запомнит в память (если не ошибаюсь в работе ФП).
Один раз создали экземпляр - он один раз создался. Без разницы, сколько будет подписок на него и сколько раз он продиспатчит событие. Если Вы намеренно не создадите второй такой экземпляр (не копия, просто новый), то это вы намеренно его создали. Ничего без Вашего ведома не создается, кроме клонирования Event при диспатче-всплытии (но это уже совсем другая история).

viktorami 07.06.2012 14:10

var lnt:class1=new class1();
----------
посмотрите в моем коде эта строчка - экземпляр класса содается для того, чтобы отправит целевой dispatch
но уже один экземпляр этого класса есть - получается тут копия

Добавлено через 30 секунд
я понимаю что класс не равно копия. но тут то создается именно новый экземпляр.

Добавлено через 2 минуты
Если Вы намеренно не создадите второй такой экземпляр (не копия, просто новый), то это вы намеренно его создали.
---------
намеренно. но явынужден это сделать чтобы получить цель для dispatchevent
вы же видите мой код выше

КорДум 07.06.2012 14:15

Ничего не понял. Так используйте первый экземпляр. Он точно такой же экземпляр, как и вновь созданный. В смысле, тоже может диспатчить. Передавайте его по ссылке, что ли.

viktorami 07.06.2012 14:22

его класс 2 не видит
я не могу видеть из класса 2 класс 1 в этом то и проблема!

Добавлено через 19 минут
ха! по ссылке я этот метод прекрастно знаю если я его буду использовать мне и так легко и просто будут доступны все методы и процедуры другого класса. но это морока с передачей this в конструктор и так далее.
пишу ведь:
хочу чтобы класс диктовал свою волю произвольному классу без предыдущей передачи ссылок в конструкторы, без использования того что событие фиксирует не только объект получатель но и все остальные.
чтобы один класс напрямую перкликался данными и волей с другим.

КорДум 07.06.2012 14:47

Вы только еще больше запутываете себя и всех других. В общем, Вам бы почитать что-то про паттерны. И прочую литературку про ООП.
По конкретной задаче
Цитата:

чтобы один класс напрямую перкликался данными и волей с другим.
Вам может помочь синглтон. Однако мне кажется нерациональным его применения, хотя ничего другого посоветовать уже не могу: все другие участники форума и я сам телепатически изложили все основы правильной архитектуры. Вам только все перечитать и вникнуть. Все, я ухожу отсюда.

Aquahawk 07.06.2012 14:53

заранее прошу прощения, но ДАЙТЕ УЖЕ ВАШ КОД!!!ВЕСЬ!

Hauts 07.06.2012 15:06

Присоединяюсь к Aquahawk. Пожалуй более желанного кода с флэшера.ру я не припоминаю.

viktorami 07.06.2012 16:13

главный класс cosmetics из него создаем по экземпляру class1 и class2
ЗАДАЧА:
отправить из класса1 событие классу2. в перспективе еще надо будет попытатся отправлять не только событие но и данные как то.

Код AS3:

        import flash.display.MovieClip;
        import flash.display.Sprite;
        import flash.events.*;
 
        [SWF(width="1115", height="800", frameRate="30", backgroundColor="#000000")]
        public class cosmetics extends Sprite
        {
 
 
 
                public function cosmetics()
                {
 
                var class1:cl1=new class1( );       
                addChild(cl1);
 
                var cl2:class2=new class2();       
                addChild(cl2);
 
                }
 
        }
}

соержимое класса class2
Код AS3:

package   
{
        import flash.display.MovieClip;
        import flash.display.Sprite;
        import flash.events.*;
        public class lentW extends Sprite
        {
                public function lentW() 
                {
 
                addEventListener("myCustomEvent", myCustomEventListener);
 
                }
                function myCustomEventListener(event:Event):void
                {
                        trace("внутри объекта стрицы");
                }
        }
}


содержимое класса class1

Код AS3:

package 
{
        import flash.display.Bitmap;
        import flash.display.Loader;
        import flash.display.MovieClip;
        import flash.display.Sprite;
        import flash.events.*;
        import flash.geom.*;
        import flash.net.*;
        import flash.utils.Timer;
 
        public class gallery  extends Sprite
        {
                var i,ii,iii:int;
 
                var cl2:class2=new class2();
 
                public function leftArrayClick(e:MouseEvent):void
                {
 
                cl2.dispatchEvent( "myCustomEvent" );
}
}
}

Добавлено через 1 минуту
я вынужден создавать копию класса
var cl2:class2=new class2();
для того чтобы отправить dispatchEvent

Hauts 07.06.2012 16:25

Главный класс cosmetics:

Код AS3:

class1.addEventListener("myCustomEvent", class2.myCustomEventListener)

Сойдет? Поправьте меня, если я неправильно написал.

А вообще можете колбэками пользоваться...

КорДум 07.06.2012 16:32

Неееет! Hauts, неееет!
Код AS3:

cl1.addEventListener("myCustomEvent", cl2.myCustomEventListener)

Вот так. А то... это породит новые посты.

Hauts 07.06.2012 16:34

Что-то я запутался с class1 и cl1 :)

И не могу врубиться в

Код AS3:

var class1:cl1=new class1( );        
addChild(cl1);


viktorami 07.06.2012 16:36

Hauts мне хочется чтобы два класса перкликались ИМЕННО МЕЖДУ СОБОЙ не используя класс-общий родитель(если я правильно понял вашу идею)

Добавлено через 1 минуту
кордум. для этого все равно надо имедь экземпляр cl2 а для эттого мне все равно небоходимо его вторичнное созание в экземпляре cl1

Hauts 07.06.2012 16:38

static public function может сгодится?

P.S. Сдаюсь. Перехожу в режим чтения :)

КорДум 07.06.2012 16:39

Код AS3:

        import flash.display.MovieClip;
        import flash.display.Sprite;
        import flash.events.*;
 
        [SWF(width="1115", height="800", frameRate="30", backgroundColor="#000000")]
        public class cosmetics extends Sprite
        {
 
 
 
                public function cosmetics()
                {
 
                var class1:cl1=new class1( );       
                addChild(cl1);
 
                var cl2:class2=new class2();       
                addChild(cl2);
 
                }
 
        }
}

А ЭТО ЧТО?!
Это общий класс. Родитель. Называйте его как хотите.
И перестаньте уже путать классы и их экземпляры. В as3 классы НЕ УМЕЮТ рассылать события.

И ничего вторично создавать там не нужно. Уже все создано.

viktorami 07.06.2012 16:41

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

КорДум 07.06.2012 16:44

Минутку. Я соберу все свое терпение.
Напишите в этом общем классе одну единственную строчку
Код AS3:

cl1.addEventListener("myEvent", cl2.dispatchEvent);

И все. Радуйтесь. Пожалуйста.

viktorami 07.06.2012 16:51

я соберу все свое терпение. и скажу то что сказал уже три раза. я изначально знал как это сделать при написаниее кода ВО БЩЕМ классе.
Мне очень хочется чтобы мои объекты-классы САМИ ОБЩАЛИСЬ между собой -чтобы все было В НИХ

Добавлено через 1 минуту
представьте- классы, как отдельные организмы с величием и славой общаются между собой. а никто этого не знает и не нужно ни о чем морочится. рай же это на земле!

КорДум 07.06.2012 16:54

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

viktorami 07.06.2012 16:56

а ту строчку где оператор(в моем коде)
dispatchevent убрать что ли? кроме того там остается этот второй экземпляр

Добавлено через 43 секунды
Короче. Классы не умеют рассылать события. Любой экземпляр без ссылки на другой эземпляр ничего с ним не сможет сделать. Или без их общего "контроллера".
--------
понял. а подскажите -я добавил это сточку в общем классе. а со строчкой где disatchevent что делать?

carrotoff 07.06.2012 16:57

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

Цитата:

я изначально знал как это сделать при написаниее кода ВО БЩЕМ классе.
Эта фраза говорит, что вы так и не поняли того, что пытается донести КорДум. Пожалейте его нервы

КорДум 07.06.2012 16:59

Я запутался в вашей архитектуре. Наверно. Или передавайте ссылку.

Hauts 07.06.2012 17:02

viktorami сделайте ваши классы статичными :)

viktorami 07.06.2012 17:02

кордум. да так работает. спасибо. при вынесенном слушателе в класс родитель. а может кто нибудь знает как передать не только само событие но и данные какие либо?

КорДум 07.06.2012 17:04

Посмотрите в сторону своих событий или DataEvent, если нужна просто строка.

viktorami 07.06.2012 17:04

оффтоп: разработчики на стороне зла, раз не дают классам общатся между собой полностью скрытно - без включения дело родителя или ссылок с класса на класс.


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

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