Просмотр полной версии : Доступ из класса в класс
Есть два класса из одного вызываю функцию в другом, а потом хочу из другого вызвать функцию из первого - не получается.
Где можно почитать о правильной иерархии, или как это называется, классов, у Мука совсем мало об этом, или я не правильно понимаю суть проблемы?
Связать классы подпиской на события друг-друга, например.
Или почитай про IoC/DI: http://orangeflash.eu/?p=79
Там написано "это сможет поянть даже контуженый инвалид" очевидно это я и есть. :( По сути ничего не изменилось из первого доступ есть, из второго нет.
Я же говорю — сделать обоих вещателями.
A создает B, подписывает B на свои события и сам подписывается на события B. Вот тебе и двусторонняя связь.
class Class1{
public function fun1() {
//бла-бла
}
public function fun2() {
//бла-бла
Class2.fun3(arg)
}
}
//
class Class2{
public static function fun3(arg) {
//бла-бла
if(бла-бла){
Class1.fun1()
}
}
}Вот как сейчас есть, если я в первом классе напишу
private var b:Class2 и из Class2 уберу static из функции он все равно ругается
а ругается случаем не на то, что у Class1 нет статического fun1() ?
а ругается случаем не на то, что у Class1 нет статического fun1() ? Да так и ругается, но я не могу ее сделать статической
Нет-нет.
import mx.events.EventDispatcher;
class AnyClass {
public var addEventListener:Function;
public var removeEventListener:Function;
public var dispatchEvent:Function;
public function AnyClass(otherClass:OtherClass) {
EventDispatcher.initialize(this);
this.addEventListener("onAnyClassEvent",otherClass);
otherClass.addEventListener("onOtherClassEvent",this);
this.sendMessage();
}
private function sendMessage():Void {
this.dispatchEvent({type:'onAnyClassEvent',data:'test'});
}
private function onOtherClassEvent(event:Object):Void {
trace('Class AnyClass received event from OtherClass data: '+event.data);
}
}
import mx.events.EventDispatcher;
class OtherClass {
public var addEventListener:Function;
public var removeEventListener:Function;
public var dispatchEvent:Function;
public function OtherClass() {
EventDispatcher.initialize(this);
}
private function onAnyClassEvent(event:Object):Void {
trace('Class OtherClass received event from AnyClass data: '+event.data);
this.dispatchEvent({type:'onOtherClassEvent',data:'hello'});
}
}
var otherClass:OtherClass = new OtherClass();
var anyClass:AnyClass = new AnyClass(otherClass);
Да мудрено, буду разбираться, спасибо, где этому учат? :)
Типа за каждый пост не во флейм, пару байтов в мозг
смотря для чего оно надо.., а то можно и по-простому ссылками обменяться, не привлекая для этого диспатчер:
class Class1{
public function fun1() {
//бла-бла
}
public function fun2() {
//бла-бла
Class2.fun3(this)
}
}
//
class Class2{
public static function fun3(obj) {
//бла-бла
obj.fun1()
}
}
To __etc спасибо еще раз. Сегодня сел разбираться все получилось, т.е. нужно подписывать ту функцию, которую использую из другого класса. А как можно поступить так же с переменными, чтобы можно было видеть переменные первого класса во втором и если надо менять их. А может разумнее создать класс для переменных и хранить их там. Но тогда не хочется писать VarClass.myVar, может есть какой другой красивый способ?
Ну не знаю, насколько оно красиво, но передавать можно ссылку на первый класс. Но тогда будет жесткая связь.
Лучше на событийной модели, вещать из второго класса первому, чтобы тот поменял параметр.
Но ведь не получается писать жестко var myVarClass2 = Class1.myVarClass1
Он ругается: имя мол конфликтует
Не надо путать статические свойства с обычными.
import mx.events.EventDispatcher;
class AnyClass {
public var addEventListener:Function;
public var removeEventListener:Function;
public var dispatchEvent:Function;
private var otherClass:OtherClass;
public var anyVariable:Number;
public function AnyClass(otherClass:OtherClass) {
EventDispatcher.initialize(this);
this.anyVariable = 5;
this.addEventListener("onAnyClassEvent",otherClass);
otherClass.addEventListener("onOtherClassEvent",this);
otherClass.anyClass = this;
this.otherClass = otherClass;
this.sendMessage();
}
private function sendMessage():Void {
this.dispatchEvent({type:'onAnyClassEvent',data:'test'});
}
private function onOtherClassEvent(event:Object):Void {
trace('Class AnyClass received event from OtherClass data: '+event.data+', anyVariable = '+this.anyVariable);
}
}
class OtherClass {
public var addEventListener:Function;
public var removeEventListener:Function;
public var dispatchEvent:Function;
public var anyClass:AnyClass;
public function OtherClass() {
EventDispatcher.initialize(this);
}
private function onAnyClassEvent(event:Object):Void {
trace('Class OtherClass received event from AnyClass data: '+event.data);
if (this.anyClass) {
this.anyClass.anyVariable = 10;
}
this.dispatchEvent({type:'onOtherClassEvent',data:'hello'});
}
}
Получается та же история, как и с функциями, да...
Вообще-то он ругается как и раньше, я думал у меня ошибка, но сохранил твой код, тоже самоеThe name of this class, 'OtherClass', conflicts with the name of another class that was loaded, 'OtherClass'.
Я же говорю — в событии посылаешь нужное значение параметра и вызываешь событие, которое и будет менять значение.
Ругается? Удали ASO файлы (Control > Delete ASO Files) или перемести проект в другую папку.
Ну тогда назови класс по-другому. Бывают у флеша критические дни…
Да точно, переименование помогло, действительно критические...
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.