Как мне ссылаться на экземпляр класса из другого экземпляра класса в Actionscript 3.0? - PullRequest
0 голосов
/ 10 декабря 2010

Быстрый вопрос. Я гуглил это все утро, но его либо нет, либо написано так, что он не регистрируется. Я склонен верить последнему, поскольку мне кажется, что это должно быть чем-то совершенно тривиальным для меня.

Я сделал небольшой Flash-файл, используя AS 3.0, и впервые я действительно смог придерживаться ООП-способа выполнения действий, а не собирать воедино разные вещи из временной шкалы, чтобы обойтись без все работают в классах.

Так что я бы хотел оставить это так, но одна вещь ускользает от меня: я не могу вызвать метод экземпляра другого класса (кроме того, из которого я вызываю), не прибегая к "DocumentClass ( корень) .instanceName.method. "

Интуиция говорит мне, что должен быть лучший способ сделать это (например, без необходимости ссылаться на класс документа каждый раз, когда я вызываю функцию экземпляра другого класса; так что прошей 5 мне.

У кого-нибудь есть лучший способ сделать это, которым он может поделиться?

Заранее спасибо! SS

edit: вот соответствующий код: Основной класс:

package myApp {

    import flash.display.*;
    import flash.events.*;

    public class Main extends flash.display.MovieClip {

        public var background;

        public var control;

        public function Main() {

            //load the background
            this.background = new Background();
            this.addChild(background);

            //load the control
            this.control = new Control;
            this.addChild(control);
        }
    }
}

Фоновый класс:

package myApp {

    import flash.display.*;
    import flash.events.*;

    public class Background extends flash.display.MovieClip {

        public function Background() {
            this.x = 0;
            this.y = 0;
        }

        public function doSomething() {
            //do something here
        }

    }
}

Класс управления:

package myApp {

    import flash.display.*;
    import flash.events.*;

    public class Control extends flash.display.MovieClip {

        private var section01;
        private var section02;
        private var section03;

        public function Control() {

            //some constructor code here

        }

        public function doSomethingCaller() {
            MyApp(root).background.doSomething();   <--- HERE
        }
    }
}

1 Ответ

1 голос
/ 10 декабря 2010

Вы можете попробовать следующий подход:

package
{
    import com.A;
    import com.B;
    import flash.display.MovieClip;

    public class Main extends MovieClip
    {
        private var _a:A;
        private var _b:B;

        public function get a():A
        {
            return _a;

        }// end function

        public function Main():void
        {
            init();

        }// end function

        private function init():void
        {
            _a = new A();
            _b = new B(this);

        }// end function

    }// end class

}// end package

В ваш класс документов "Main" импортируются классы "A" и "B". Закрытые свойства "_a" и "_b" объявлены в классе "Main" для классов "A" и "B". Далее следует метод получения, называемый «a», который возвращает «_a». Далее следует закрытый метод init (), который вы вызываете из конструктора класса «Main». В методе "init ()" создаются свойства "_a" и "_b", однако для "_b" ссылка на "Main" анализируется с использованием ключевого слова "this".

package com
{
    import flash.display.MovieClip;

    public class A extends MovieClip
    {
        public function A():void {}// end function

        public function traceClassName():void
        {
            trace("Class name: A");

        }// end function

    }// end class

}// end package

В классе "A" есть открытый метод с именем "traceClassName ()", который отслеживает строку "Имя класса: A" при вызове.

package com
{
    public class B
    {
        private var _main;

        public function B(p_main):void 
        {
            _main = p_main;
            _main.a.traceClassName();

        }// end function

    }// end class

}// end package

В классе "B" у вас есть частная собственность с именем "_main". В конструкторе класса "B" у вас есть параметр для ссылки на класс Main, который будет проанализирован при создании экземпляра класса "B". Свойству _main затем присваивается ссылка на класс «Main». Теперь вы можете получить доступ к экземпляру "A" через ссылку на класс "Main" из класса "B".

Есть много подходов, это только один из более простых способов, хотя я думаю, что есть и лучшие. Вы должны представить исходный код для вашего приложения / фильма на флеш-памяти, чтобы я и все остальные могли получить лучшее представление о том, что вам подойдет.

Надеюсь, это помогло:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...