Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Доступ из класса в класс (http://www.flasher.ru/forum/showthread.php?t=90800)

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

Цитата:

Сообщение от silin
а ругается случаем не на то, что у 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

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


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

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