【问题标题】:How do I reference a class instance from another class instance in Actionscript 3.0?如何在 Actionscript 3.0 中从另一个类实例引用一个类实例?
【发布时间】:2010-12-10 16:52:55
【问题描述】:

快速提问。我整个早上都在谷歌上搜索,但它要么不存在,要么以不注册的方式编写。我倾向于相信后者,因为这对我来说似乎完全是微不足道的。

我使用 AS 3.0 制作了一个小型 Flash 文件,这是我第一次真正能够坚持 OOP 的做事方式,而不是把时间轴上的东西混在一起来解决没有一切都在课堂上工作。

所以我想保持这种状态,但有一件事让我无法理解:如果不求助于“DocumentClass( root).instanceName.method。”

直觉告诉我必须有更好的方法来做到这一点(比如,每次我调用另一个类实例的函数时都不必引用文档类;当然不必使用“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
        }
    }
}

【问题讨论】:

    标签: actionscript-3


    【解决方案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”在“A”和“B”类的“Main”类中声明。接下来有一个名为“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 应用程序/电影的源代码,以便我和其他人可以更好地了解哪个适合您。

    我希望这会有所帮助:)

    【讨论】:

    • 我很抱歉,但这只是我的想法。就像,我不明白你为什么要在 Main 类中导入额外的类,这让我觉得也许我做错了什么。让我在上面贴一些代码,也许你会明白我在说什么。
    • 想象“A”和“B”类分别是你的“背景”和“控制”类。它们都位于一个名为“com”(在您的情况下称为“MyApp”)的文件夹中,我将其导入到“Main”类中。我的示例中的“Main”类与名为“Main.fla”的 Flash 文档位于同一文件夹中。如果您不了解什么是 getter 和 setter 方法或什么是访问修饰符(例如公共、私有等),那么我可以根据需要编辑我的答案以合并这些解释。
    • 哇。我刚知道,但是 J.H. Rollerskating Christ,为了能够调用另一个实例的方法,需要跳过很多圈。我想我最好接受它作为 Actionscript 的限制之一并坚持使用 DocumentClass(root)。还是谢谢!
    • 老实说有很多更好的方法,我只是选择了一些易于理解的方法。在您的情况下,您可以简单地将 A 的引用解析为 B,而不是将 Main 的引用解析为 B。如果您愿意,可以将您的 flash 应用程序/电影发送给我,我可以随时查看。联系方式在我的个人资料上。希望我能有所帮助:)
    猜你喜欢
    • 2012-04-26
    • 1970-01-01
    • 2015-06-10
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    • 1970-01-01
    • 2018-07-25
    • 2010-09-17
    相关资源
    最近更新 更多