PDA

Просмотр полной версии : Межклассовое взаимодействие


paxcox
01.07.2008, 13:01
Недавно столкнулся с такой штуковиной:
Есть класс A в его некотором методе создается экземпляр класса B, далее есть класс F в некотором методе которого нужно получить ссылку на этот экземпляр класса B, того самого что создан в классе A.
Использование Singleton'а не катит. Передача экземпляра через конструкторы тоже не подходит. Что же делать?

crazyone
01.07.2008, 13:03
Опишите структуру поподробнее. Как связаны классы/объекты классов A и F?

paxcox
01.07.2008, 13:41
Ну грубо говоря, в классе А создаются мувики в контейнере, по событию onPress каждого мувика для каждого из них создается экземпляр класса B (здесь создаются другие мувики). D методе b1 класса B создается экземпляр класса F (этот класс двигает мувики класса B из точки в точку). Далее по аналогичному событию onPress мувиков, созданных в классе B, они: 1) должны двигаются в обратном направлении (т.е. создавать новый экземпляр класса F), 2) должны создавать экземпляр класса С(там создаются еще мувики). Далее в методе с1 класса С надо: 1) Создать новый экземпляр класса F, 2) получить ссылку на мувиклипы которые были созданы в экземпляре класса A () для получения доступа к их событиям onPress. Иными словами нужен некий callback

tikhop
01.07.2008, 13:55
Недавно столкнулся с такой штуковиной:
Есть класс A в его некотором методе создается экземпляр класса B, далее есть класс F в некотором методе которого нужно получить ссылку на этот экземпляр класса B, того самого что создан в классе A.
Использование Singleton'а не катит. Передача экземпляра через конструкторы тоже не подходит. Что же делать?
Меня тоже интересует этот вопрос.
1) использовать синглетон (что не оч хочется)
2) обращаться к статической функции класса А, которая возвращала бы ссылку на экземпляр класса В и уже в классе F работать с этой ссылкой....

Но мне кажется есть более умный способ...

iNils
01.07.2008, 14:07
Ну грубо говоря, в классе А создаются мувики в контейнере, по событию onPress каждого мувика для каждого из них создается экземпляр класса B (здесь создаются другие мувики). D методе b1 класса B создается экземпляр класса F (этот класс двигает мувики класса B из точки в точку). Далее по аналогичному событию onPress мувиков, созданных в классе B, они: 1) должны двигаются в обратном направлении (т.е. создавать новый экземпляр класса F), 2) должны создавать экземпляр класса С(там создаются еще мувики). Далее в методе с1 класса С надо: 1) Создать новый экземпляр класса F, 2) получить ссылку на мувиклипы которые были созданы в экземпляре класса A () для получения доступа к их событиям onPress. Иными словами нужен некий callback
Прямо индийское кино, все друг другу родственники и я ничего не понял.

Волгоградец
01.07.2008, 14:13
Создай массив в классе A и туда добавляй созданные экземпляры класса B. Потом с этим массивом работай в классе C.

crazyone
01.07.2008, 14:19
Прямо индийское кино, все друг другу родственники и я ничего не понял.
Я, кстати, тоже =)

Иными словами нужен некий callback
Ну раз нужен callback, так и создавайте его. Класс Delegate вам в помощь.
Как передать ссылку на этот callback в класс F - это уже вам решать. В конструкторе, или отдельным методом, или еще как... В чем у вас проблема-то?

Alex_beginner
01.07.2008, 14:49
paxcox! Вы очень подробно изложили алгоритм - я уверен, что у Вас есть исходничек. Пожалуйста выложите его здесь. Уверен, что критики не будет :).
Будет оказана помощь.

paxcox
03.07.2008, 13:24
Класс Delegate вам в помощь.
Он для компонентов
Вы очень подробно изложили алгоритм - я уверен, что у Вас есть исходничек. Пожалуйста выложите его здесь.
Там 15 классов))
короче говоря, внятно прочитав модель делегирования событий мука, вопрос отпал

crazyone
03.07.2008, 13:27
Он для компонентов

В каком смысле?

paxcox
03.07.2008, 13:52
Ну наскока я понимаю использование класса delegate подразумевает использование компонентов, так как в них есть такая штука как addEventListener.

wvxvw
03.07.2008, 14:14
Не, вы не правильно понимаете =) Delegate и addListener() никак не связаны. Delegate создает делегата (что, вобщем-то и должно быть понятно из названия класса =) т.е. функцию привязаную к объекту, с чьими свойствами она должна работать.

paxcox
03.07.2008, 14:38
Дело наверное в том что подумал я про mx.utils.Delegate а видимо вы говорите про iNils.Delegate или кто_то_еще.Delegate

crazyone
03.07.2008, 15:38
Мы говорим про mx.utils.Delegate.
А вы абсолютно не понимаете, что он из себя представляет.
Понятия не имею, почему в хелпе его запихнули в Components Language Reference, но не мне судить составителей хелпа.
Тем не менее, класс Delegate имеет только один метод. Статический метод create, который вам и советуют использовать.
А компоненты с их addEventListener к классу Delegate имеют такое же отношение, как и все остальные элементы AS.

paxcox
03.07.2008, 16:03
Хорошо. Вот что я нарыл в хелпе:
import mx.utils.Delegate;
import mx.controls.Button;
import mx.controls.CheckBox;

class Cart {
var myCheckBox_chb:CheckBox;
var myButton_btn:Button;

function onLoad() {
myCheckBox_chb.addEventListener("click", Delegate.create(this, chb_onClick));
myButton_btn.addEventListener("click", Delegate.create(this, btn_onClick));
}
function chb_onClick(eventObj:Object) {
trace(eventObj.target + ": " + eventObj.type);
trace(this)
}

function btn_onClick(eventObj:Object) {
trace(eventObj.target + ": " + eventObj.type);
}
}

Если не сложно, поясните тогда как сделать похожую конструкцию на событие onPress для MovieClipа.

crazyone
03.07.2008, 17:19
Да что ж ты будешь делать...
Класс Delegate предназначен для создания ссылок на методы объектов, которые будут вызываться в namespace указанного объекта.
Вот вам примерчик на разницу вызова метода с Delegate и без него:

import mx.utils.Delegate;

function testClass1(){
this.data="Hello from testClass1!";
this.showInfo=function(){
trace(this.data);
}
return this;
}
function testClass2(){
this.data="Good bye, this is testClass2!";
return this;
}

trace("Without mx.utils.Delegate:");
o1=new testClass1();
o2=new testClass2();
o2.myCallback=o1.showInfo;
o2.myCallback();
trace("With mx.utils.Delegate:");
o1=new testClass1();
o2=new testClass2();
o2.myCallback=Delegate.create(o1,o1.showInfo);
o2.myCallback();

paxcox
03.07.2008, 18:23
Во! То что надо, въехал! Спасибо