Просмотр полной версии : как избежать лишнего создания копии объекта?
viktorami
07.06.2012, 12:52
пусть в главном классе создан экземпляр class1 в котором приуствует слушатель на собственное событие
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
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, то лучше всего перебросить событие через родителя вот так:
a = new class1();
b = new class2();
a.addEventListener('event', b.handler);
viktorami
07.06.2012, 13:13
все сделано для того, чтобы я мог вещать от одного класа- другому. задача стоит: чтобы один класс мог "сказать" напрямую другому- прими данные такие то и так далее.
как тогда это лучше сделать?
Добавлено через 2 минуты
без передачи в один класс(в конструктор) ссылки на другой класс, без использования того факта что все события дублируются на всех уровнях иерархии и оценки их через currenttarget
чтобы один класс мог сказать другому классу: сделай то то! вот, возьми эти данные.
Посмотрите на пост Тигры.
И классы в as3 не умеют рассылать события. А их экземпляры, если они наследуют все плюшечки EventDispatcher, да.
Короче, экземпляр class1 диспатчит событие, другой экземпляр, который имеет ссылку на этот экземпляр, ловит событие и вызывает хендлер у экземпляра class2, на который в свою очередь тоже имеется ссылка в общем, так сказать, "родителе".
Psycho Tiger
07.06.2012, 13:19
Если Класс1 создал Класс2.
Классу1 нужно сказать что-то Классу2: напрямую дёргаем метод.
class1:
a = new class2();
a.someMethod();
Класс2 нужно сказать что-то Классу1:
class1:
a = new class2();
a.addEventListener('event', trace); //trace - какой-то хэндлер
class2:
dispatchEvent(new Event('event'));
Важно: диспатч событий из конструктора делать нельзя, т.к. в принципе на момент выполнения конструктора у объекта ещё не может быть добавлен слушатель.
viktorami
07.06.2012, 13:20
который имеет ссылку на этот экземпляр
-----------
а как получить внутри класса ССЫЛКУ НА ЭТОТ ЭКЗЕМПЛЯР??? вот в чем проблема!
Aquahawk
07.06.2012, 13:20
viktorami
Приведите пожалуйста весь код который вы написали для этого теста, а то сейчас вся помощь строится на догадках.
Добавлено через 32 секунды
без ссылки нет взаимодействия, нет ничего плохого в передаче ссылок
В смысле "как"? Вы же не просто вызываете конструктор класса. А пишете вот так?
a = new class1();
Ну "а" и будет ссылкой.
viktorami
07.06.2012, 13:23
dispatchEvent(new Event('event'))
так не работает! уже пробовал. просто dispatchEvent не работает! должна быть указана его цель
targetclass.dispatchEvent(new Event('event'))
Добавлено через 1 минуту
КорДум вот - сразу видно умного и понимающего человека)
об этом и изначально была речь.
если так сделать - все работает!
но вопрос: получается у меня же class1 уже создан эземпляр - тот самый в котором и слушатель прописан
а теперь я вынужден создавать ЕЩЕ ОДНУ ЕГО КОПИЮ КОТОРАЯ БУДЕТ ЖРАТЬ РЕСУРСЫ - ДУБЛЬ КЛАССА
как же так???
И классы в as3 не умеют рассылать события. А их экземпляры, если они наследуют все плюшечки EventDispatcher, да.
Мне кажется или Вы ну оооочень невнимательно читаете все, что Вам пишут?
viktorami
07.06.2012, 13:29
без ссылки нет взаимодействия, нет ничего плохого в передаче ссылок
как же ничего плохого, когда я создаю копию полную копию класса всего лишь для того чтобы отправить целевой dispatch
Aquahawk
07.06.2012, 13:32
да нет никакой копии, от копии и событие не придёт. Вы совсем запутались в том что у вас происходит. Покажите код, весь, и вам пояснят.
Psycho Tiger
07.06.2012, 13:32
так не работает! уже пробовал. просто dispatchEvent не работает! должна быть указана его цель
Если ничего не указано - подразумевается контекст this. Значит, твой класс не наследуется от EventDispatcher'a.
И вообщем, я умываю руки.
Класс != копия. Класс - это просто код, описывающий поведение экземпляра. Ну и может иметь статичные методы класса, но сейчас речь не об этом.
Пока Вы не создали экземпляр класса, сам класс никакой своей жизнью жить не будет. Он точно так же, как и все другие - просто будет находиться в памяти в виде байткода и ждать своего часа, когда интерпретатор заглянет в него и запомнит в память (если не ошибаюсь в работе ФП).
Один раз создали экземпляр - он один раз создался. Без разницы, сколько будет подписок на него и сколько раз он продиспатчит событие. Если Вы намеренно не создадите второй такой экземпляр (не копия, просто новый), то это вы намеренно его создали. Ничего без Вашего ведома не создается, кроме клонирования Event при диспатче-всплытии (но это уже совсем другая история).
viktorami
07.06.2012, 14:10
var lnt:class1=new class1();
----------
посмотрите в моем коде эта строчка - экземпляр класса содается для того, чтобы отправит целевой dispatch
но уже один экземпляр этого класса есть - получается тут копия
Добавлено через 30 секунд
я понимаю что класс не равно копия. но тут то создается именно новый экземпляр.
Добавлено через 2 минуты
Если Вы намеренно не создадите второй такой экземпляр (не копия, просто новый), то это вы намеренно его создали.
---------
намеренно. но явынужден это сделать чтобы получить цель для dispatchevent
вы же видите мой код выше
Ничего не понял. Так используйте первый экземпляр. Он точно такой же экземпляр, как и вновь созданный. В смысле, тоже может диспатчить. Передавайте его по ссылке, что ли.
viktorami
07.06.2012, 14:22
его класс 2 не видит
я не могу видеть из класса 2 класс 1 в этом то и проблема!
Добавлено через 19 минут
ха! по ссылке я этот метод прекрастно знаю если я его буду использовать мне и так легко и просто будут доступны все методы и процедуры другого класса. но это морока с передачей this в конструктор и так далее.
пишу ведь:
хочу чтобы класс диктовал свою волю произвольному классу без предыдущей передачи ссылок в конструкторы, без использования того что событие фиксирует не только объект получатель но и все остальные.
чтобы один класс напрямую перкликался данными и волей с другим.
Вы только еще больше запутываете себя и всех других. В общем, Вам бы почитать что-то про паттерны. И прочую литературку про ООП.
По конкретной задаче
чтобы один класс напрямую перкликался данными и волей с другим.
Вам может помочь синглтон. Однако мне кажется нерациональным его применения, хотя ничего другого посоветовать уже не могу: все другие участники форума и я сам телепатически изложили все основы правильной архитектуры. Вам только все перечитать и вникнуть. Все, я ухожу отсюда.
Aquahawk
07.06.2012, 14:53
заранее прошу прощения, но ДАЙТЕ УЖЕ ВАШ КОД!!!ВЕСЬ!
Присоединяюсь к Aquahawk. Пожалуй более желанного кода с флэшера.ру я не припоминаю.
viktorami
07.06.2012, 16:13
главный класс cosmetics из него создаем по экземпляру class1 и class2
ЗАДАЧА:
отправить из класса1 событие классу2. в перспективе еще надо будет попытатся отправлять не только событие но и данные как то.
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
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
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
Главный класс cosmetics:
class1.addEventListener("myCustomEvent", class2.myCustomEventListener)
Сойдет? Поправьте меня, если я неправильно написал.
А вообще можете колбэками пользоваться...
Неееет! Hauts, неееет!
cl1.addEventListener("myCustomEvent", cl2.myCustomEventListener)
Вот так. А то... это породит новые посты.
Что-то я запутался с class1 и cl1 :)
И не могу врубиться в
var class1:cl1=new class1( );
addChild(cl1);
viktorami
07.06.2012, 16:36
Hauts мне хочется чтобы два класса перкликались ИМЕННО МЕЖДУ СОБОЙ не используя класс-общий родитель(если я правильно понял вашу идею)
Добавлено через 1 минуту
кордум. для этого все равно надо имедь экземпляр cl2 а для эттого мне все равно небоходимо его вторичнное созание в экземпляре cl1
static public function может сгодится?
P.S. Сдаюсь. Перехожу в режим чтения :)
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
то есть вы предлагаете создать слушатель в классе- общем родителе? а я как раз этого нехотел. хотел чтобы классы сами слышали друг друга без обращения к родителю. но чтобы и ссылки им на друг друга не передавать чур!
Минутку. Я соберу все свое терпение.
Напишите в этом общем классе одну единственную строчку
cl1.addEventListener("myEvent", cl2.dispatchEvent);
И все. Радуйтесь. Пожалуйста.
viktorami
07.06.2012, 16:51
я соберу все свое терпение. и скажу то что сказал уже три раза. я изначально знал как это сделать при написаниее кода ВО БЩЕМ классе.
Мне очень хочется чтобы мои объекты-классы САМИ ОБЩАЛИСЬ между собой -чтобы все было В НИХ
Добавлено через 1 минуту
представьте- классы, как отдельные организмы с величием и славой общаются между собой. а никто этого не знает и не нужно ни о чем морочится. рай же это на земле!
Короче. Классы не умеют рассылать события. Любой экземпляр без ссылки на другой эземпляр ничего с ним не сможет сделать. Или без их общего "контроллера".
viktorami
07.06.2012, 16:56
а ту строчку где оператор(в моем коде)
dispatchevent убрать что ли? кроме того там остается этот второй экземпляр
Добавлено через 43 секунды
Короче. Классы не умеют рассылать события. Любой экземпляр без ссылки на другой эземпляр ничего с ним не сможет сделать. Или без их общего "контроллера".
--------
понял. а подскажите -я добавил это сточку в общем классе. а со строчкой где disatchevent что делать?
carrotoff
07.06.2012, 16:57
viktorami, завидую вашему упорству. С радостью прочитал весь топик.
Ваша проблема в том, что вы не понимаете чего хотите. Да и я этого так и не понял. В вашей голове перемешены все понятия - классы/экземпляры/объекты/методы/свойства.
я изначально знал как это сделать при написаниее кода ВО БЩЕМ классе.
Эта фраза говорит, что вы так и не поняли того, что пытается донести КорДум. Пожалейте его нервы
Я запутался в вашей архитектуре. Наверно. Или передавайте ссылку.
viktorami сделайте ваши классы статичными :)
viktorami
07.06.2012, 17:02
кордум. да так работает. спасибо. при вынесенном слушателе в класс родитель. а может кто нибудь знает как передать не только само событие но и данные какие либо?
Посмотрите в сторону своих событий или DataEvent, если нужна просто строка.
viktorami
07.06.2012, 17:04
оффтоп: разработчики на стороне зла, раз не дают классам общатся между собой полностью скрытно - без включения дело родителя или ссылок с класса на класс.
Aquahawk
07.06.2012, 17:05
как передать не только само событие но и данные какие либо?
Надо сделать свой класс наследованный от Event, в нем полями определить все данные которые хочется и передать, и слать его. И ловить его, все данные будут там.
viktorami
07.06.2012, 17:05
а в каком контексте это:
сторону своих событий
Вот в этом
http://www.flasher.ru/forum/showthread.php?t=147849
viktorami
07.06.2012, 17:07
Aquahawk - что вы имеете виду:слать класс, ловить класс.
получается на самом деле сейчас в as3 вот эти события - это не просто переход на функцию а отсылка целлого класса?!
Aquahawk
07.06.2012, 17:07
viktorami А как вы себе представляете это? Два разных класса без ссылок друг на друга и вообще не подозревающие друг о друге должны общаться, а вдруг второго класса нет, как тогда первый поймёт что ему не с кем общаться?
Добавлено через 1 минуту
viktorami
Aquahawk - что вы имеете виду:слать класс, ловить класс.
получается на самом деле сейчас в as3 вот эти события - это не просто переход на функцию а отсылка целлого класса?!
Не класса а объекта. Да, когда вы делаете dispatchEvent вы отправляете объект класса Event. Можно сделать своего наследника и слать его, в нём любые данные. Это просто передача ссылки на этот объект. Ничего страшного в этом нет.
viktorami
07.06.2012, 17:11
то есть я делаю класс extend от event указываю в нем свое поле, и создаю экземпляр в каждом классе получателе и отправителе.
в отправителе заполняю нужное поле потом вызываю у этого класса метод dispatch
а когда приму в том классе- поле уже будет содержать эти даные?
и создаю экземпляр в каждом классе получателе и отправителе.
Только в отправителе. Заполняете поле, диспатчите, в получателе ловите и все. Обращаетесь к полю, в котором будут данные.
Aquahawk
07.06.2012, 17:14
то есть я делаю класс extend от event указываю в нем свое поле,
Да
создаю экземпляр в каждом классе получателе и отправителе.
нет
Когда хотите сделать dispatchEvnt вы создаёте такой объект, и его передаёте в dispatchEvent и он и пойдёт всем подписчикам. Они прямо этот объект и получат, второй раз его создавать не надо. Только прочитайте про наследование Event
viktorami
07.06.2012, 17:16
сейчас попробую
Добавлено через 9 минут
package
{
import flash.events.Event;
import flash.events.EventDispatcher;
public class eventer extends Event
{
public var vl:String;
public function eventer()
{
}
}
}
на входе в главную функцию выдает ошибку:
не удалось найти конструктор по умолчанию в базовом классе event
2viktorami, я предлагаю вам хотя бы немного изучить основы, сейчас Вы лишь тратите свое время, и людей, которые все еще пытаются Вам помочь.
Думаю, Вам нужно изучить ту ссылку, что я дал, полностью.
viktorami
07.06.2012, 17:37
все получилось. всем спасибо!
Aquahawk
07.06.2012, 17:43
а теперь самое время прочитать Мука.
strangedk
07.06.2012, 20:52
Хотел фильм вечером посмотреть, теперь не буду. Давно не видел такого экшна.
viktorami, совсем непонятно ваше упорство на своём.
Подучитесь, узнайте банальные основы, и тогда у вас всё получится.
все получилось. всем спасибо!
Все всё поняли. Полагаю, что дальнейшее будет только офтопом или общими моментами. Закрыто.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.