Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 如何从Actionscript 3.0中的另一个类实例引用一个类实例?_Actionscript 3 - Fatal编程技术网

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

Actionscript 3 如何从Actionscript 3.0中的另一个类实例引用一个类实例?,actionscript-3,Actionscript 3,快速提问。我整个上午都在谷歌上搜索,但它要么不在那里,要么以一种无法注册的方式书写。我倾向于相信后者,因为这似乎对我来说应该是一件微不足道的事情 我使用AS 3.0制作了一个小的Flash文件,这是我第一次真正能够坚持采用面向对象的方式来做事情,而不是从时间线中拼凑出一堆东西来避免在课堂上一切都不正常 所以我想保持这种方式,但有一件事我一直在逃避:我不能调用另一个类的实例(而不是我从中调用的实例)的方法,而不诉诸“DocumentClass(root).instanceName.method”

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

我使用AS 3.0制作了一个小的Flash文件,这是我第一次真正能够坚持采用面向对象的方式来做事情,而不是从时间线中拼凑出一堆东西来避免在课堂上一切都不正常

所以我想保持这种方式,但有一件事我一直在逃避:我不能调用另一个类的实例(而不是我从中调用的实例)的方法,而不诉诸“DocumentClass(root).instanceName.method”

直觉告诉我必须有更好的方法来实现这一点(比如,不必每次调用另一个类实例的函数时都引用document类;当然也不必使用“root”一词——这在我看来太简单了

有谁有更好的方法可以分享吗

提前谢谢!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
        }
    }
}
打包myApp{
导入flash.display.*;
导入flash.events.*;
公共类控件扩展了flash.display.MovieClip{
私人var第01节;
私营部门第02条;
私家车第03条;
公共职能控制(){
//这里有一些构造函数代码
}
公共函数doSomethingCaller(){

MyApp(root).background.doSomething();您可以尝试以下方法:

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”类的引用访问“a”的实例从“B”类开始

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


我希望这有帮助:)

很抱歉,这件事让我不知所措。比如,我不明白你为什么要在主类中导入额外的类,这让我觉得我可能做错了什么。让我在上面发布一些代码,也许你会明白我在说什么。想象一下,“A”和“B”类是你的“背景”和“控制”类。它们都在一个名为“com”的文件夹中(在您的例子中称为“MyApp”),我将其导入到“Main”类中。我的示例中的“Main”类与名为“Main.fla”的flash文档位于同一文件夹中。如果您不了解什么是getter和setter方法,或者什么是访问修饰符(例如public、private等)如果你愿意的话,我可以编辑我的答案来解释这些解释。哇,我刚刚得到了答案,但是J.H.Rollerskating Christ为了能够调用另一个实例的方法,需要跳过很多困难。我想我最好还是接受它作为Actionscript的一个限制,并坚持使用DocumentClass(root)。无论如何,谢谢!老实说,有更好的方法,我只是用了一些简单易懂的方法。在你的情况下,不用解析Main到B的引用,你可以简单地解析a到B的引用。如果你愿意,你可以将你的flash应用程序/电影发送给我,我可以随时查看。联系详细信息在我的个人资料上。希望我可以lped有点:)