Actionscript 3 AS3从另一个类访问主类内的方法。给出错误?

Actionscript 3 AS3从另一个类访问主类内的方法。给出错误?,actionscript-3,Actionscript 3,我在使用actionScript时遇到了麻烦,我试图使用一个简单的单行代码来访问Document类(Main)中的一个方法,但每次我都会出错。我在舞台上用movieClip尝试了同样的代码,效果很好 链接到fla的主类: Leecher类: package { import flash.display.*; public class Leecher extends MovieClip { public function leech():void

我在使用actionScript时遇到了麻烦,我试图使用一个简单的单行代码来访问Document类(Main)中的一个方法,但每次我都会出错。我在舞台上用movieClip尝试了同样的代码,效果很好

链接到fla的主类:

Leecher类:

package {

    import flash.display.*;

    public class Leecher extends MovieClip {

        public function leech():void
        {
            trace(" leech function ");

            Main(parent).callMe();       // output null object
            Main(root).callMe();        // output null object
            Main(Main).callMe();       // output null object


        }

    }

}
package 
{

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


    public class Button extends MovieClip {


        public function Button() {
            this.addEventListener(MouseEvent.CLICK,r_click);
        }
        private function r_click(e:MouseEvent):void {
            var l:Leecher = new Leecher();
            l.leech();
            Main(parent).callMe();  // hey nice work
            Main(root).callMe();    // hey nice work
            Main(Main).callMe();    // output null object

        }
    }

}
相同的代码,但类链接到舞台上的按钮

package {

    import flash.display.*;

    public class Leecher extends MovieClip {

        public function leech():void
        {
            trace(" leech function ");

            Main(parent).callMe();       // output null object
            Main(root).callMe();        // output null object
            Main(Main).callMe();       // output null object


        }

    }

}
package 
{

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


    public class Button extends MovieClip {


        public function Button() {
            this.addEventListener(MouseEvent.CLICK,r_click);
        }
        private function r_click(e:MouseEvent):void {
            var l:Leecher = new Leecher();
            l.leech();
            Main(parent).callMe();  // hey nice work
            Main(root).callMe();    // hey nice work
            Main(Main).callMe();    // output null object

        }
    }

}

错误是因为当该代码运行时,
Leecher
实例尚未添加到显示列表中,因此没有
parent
root
stage
(因此
parent
null

下面是正在发生的事情的分类(用代码注释解释):

显示对象的
阶段
变量仅在所述显示对象添加到显示列表时填充。在
root
stage
的情况下,还必须添加父母(以及任何祖父母),以便最顶端的父母/祖父母是
stage

因此,您需要等待,直到可以安全地通过侦听
事件访问
父级

private function _click(e:MouseEvent):void {
    var l:Leecher = new Leecher();

    //call the leech method once the child has been added to the stage and has a parent value
    l.addEventListener(Event.ADDED_TO_STAGE, l.leech, false, 0, true);
    addChild(l);
}
如果执行上述操作,则需要向leech方法添加可选的事件参数,否则会出现错误:

public function leech(e:Event = null):void
{

为了使主类易于访问,可以使用静态引用。 静态变量不绑定到对象的实例,而是绑定到类本身

public class Main extends MovieClip {
    //create a static var that holds a reference to the root/main instance 
    public static var main:Main;

    public function Main() {
        //assign the static var to this (the instance of Main)
        main = this;

        //...rest of code
如果这样做,您可以通过执行
Main.Main
来评估代码中任何地方的根,因此在您的示例中,您可以执行以下操作:

Main.main.callMe();

我建议在疯狂使用静态变量之前,多读一些关于静态变量的书。执行我刚才为方便引用文档类/根而展示的操作是安全的,但在其他上下文中,最好注意一些内存和性能方面的细微差别。

DisplayObject.parent和DisplayObject.root仅在相关的DisplayObject附加到stage的显示列表时才定义。按钮实例是附加的,因此可以工作,Leecher实例没有附加到任何东西,其父实例和根实例都为null。然后,Main(anything)是一个类型转换,类本身不是实例,所以Main(Main)总是会给出null为我修复错误,敬请谅解