PDA

Просмотр полной версии : Доступ из класса в класс


Futs
18.01.2007, 15:20
Есть два класса из одного вызываю функцию в другом, а потом хочу из другого вызвать функцию из первого - не получается.
Где можно почитать о правильной иерархии, или как это называется, классов, у Мука совсем мало об этом, или я не правильно понимаю суть проблемы?

etc
18.01.2007, 15:29
Связать классы подпиской на события друг-друга, например.
Или почитай про IoC/DI: http://orangeflash.eu/?p=79

Futs
18.01.2007, 16:01
Там написано "это сможет поянть даже контуженый инвалид" очевидно это я и есть. :( По сути ничего не изменилось из первого доступ есть, из второго нет.

etc
18.01.2007, 16:05
Я же говорю — сделать обоих вещателями.
A создает B, подписывает B на свои события и сам подписывается на события B. Вот тебе и двусторонняя связь.

Futs
18.01.2007, 16:29
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 из функции он все равно ругается

silin
18.01.2007, 17:01
а ругается случаем не на то, что у Class1 нет статического fun1() ?

Futs
18.01.2007, 17:18
а ругается случаем не на то, что у Class1 нет статического fun1() ? Да так и ругается, но я не могу ее сделать статической

etc
18.01.2007, 17:20
Нет-нет.


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);

Futs
18.01.2007, 17:23
Да мудрено, буду разбираться, спасибо, где этому учат? :)

etc
18.01.2007, 17:26
Здесь :D

Futs
18.01.2007, 17:32
Типа за каждый пост не во флейм, пару байтов в мозг

silin
18.01.2007, 17:50
смотря для чего оно надо.., а то можно и по-простому ссылками обменяться, не привлекая для этого диспатчер:
class Class1{
public function fun1() {
//бла-бла
}
public function fun2() {
//бла-бла
Class2.fun3(this)
}
}
//
class Class2{
public static function fun3(obj) {
//бла-бла
obj.fun1()
}
}

Futs
22.01.2007, 15:34
To __etc спасибо еще раз. Сегодня сел разбираться все получилось, т.е. нужно подписывать ту функцию, которую использую из другого класса. А как можно поступить так же с переменными, чтобы можно было видеть переменные первого класса во втором и если надо менять их. А может разумнее создать класс для переменных и хранить их там. Но тогда не хочется писать VarClass.myVar, может есть какой другой красивый способ?

etc
22.01.2007, 15:46
Ну не знаю, насколько оно красиво, но передавать можно ссылку на первый класс. Но тогда будет жесткая связь.

Лучше на событийной модели, вещать из второго класса первому, чтобы тот поменял параметр.

Futs
22.01.2007, 15:57
Но ведь не получается писать жестко var myVarClass2 = Class1.myVarClass1
Он ругается: имя мол конфликтует

etc
22.01.2007, 16:08
Не надо путать статические свойства с обычными.
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'});
}
}

Futs
22.01.2007, 16:16
Получается та же история, как и с функциями, да...

Futs
22.01.2007, 16:55
Вообще-то он ругается как и раньше, я думал у меня ошибка, но сохранил твой код, тоже самоеThe name of this class, 'OtherClass', conflicts with the name of another class that was loaded, 'OtherClass'.

etc
22.01.2007, 16:59
Я же говорю — в событии посылаешь нужное значение параметра и вызываешь событие, которое и будет менять значение.

Ругается? Удали ASO файлы (Control > Delete ASO Files) или перемести проект в другую папку.

Futs
22.01.2007, 17:06
Не помогает

etc
22.01.2007, 17:26
Ну тогда назови класс по-другому. Бывают у флеша критические дни…

Futs
22.01.2007, 17:34
Да точно, переименование помогло, действительно критические...