如何从Actionscript 3.0中的另一个类实例引用类实例?

时间:2010-12-10 06:19:01

标签: actionscript-3

快速提问。我整个上午一直在谷歌搜索,但它要么不在那里,要么以不注册的方式写。我倾向于相信后者,因为这似乎对我来说应该是完全无关紧要的事情。

我使用AS 3.0创建了一个小的Flash文件,这是我第一次真正能够坚持OOP的做事方式而不是从时间线上混合各种东西来避免一切都在课堂上运作。

所以我想保持这种方式,但有一件事让我望而却步:我不能在不诉诸“DocumentClass”的情况下调用另一个类的实例的方法(而不是我调用的那个)根).instanceName.method“。

Intuition告诉我必须有一个更好的方法来做到这一点(比如,每次我调用另一个类实例的函数时都不需要引用文档类;而且只需要不必使用“root”这个词 - 只是看起来似乎所以Flash 5对我来说。

有没有人有更好的方法可以分享?

提前致谢! SS

编辑:这是一些相关的代码: 主要课程:

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 个答案:

答案 0 :(得分:1)

您可以尝试以下方法:

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”的getter方法,它返回“_a”。接下来是一个名为“init()”的私有方法,您可以从“Main”类的构造函数调用它。在方法“init()”中,实例化“_a”和“_ b”属性,但是对于“_b”,使用“this”关键字解析对“Main”的引用。

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()”的公共方法,它在调用时跟踪字符串“Class name: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”类的构造函数中,您有一个参数,用于在实例化“B”类时要解析的Main类的引用。然后为“_main”属性分配对“Main”类的引用。现在,您可以通过“B”类中“Main”类的引用来访问“A”的实例。

有很多方法,这只是一种更简单的方法,虽然我认为有更好的方法。你应该提供你的flash应用程序/电影的源代码,这样我和其他人都可以更好地了解哪种适合你。

我希望这有助于:)