Actionscript 3 调用自定义方法作为显示对象AS3

Actionscript 3 调用自定义方法作为显示对象AS3,actionscript-3,flash,class,inheritance,reference,Actionscript 3,Flash,Class,Inheritance,Reference,我有一个扩展MovieClip的类。这个类有一个update()函数,需要在每个新的框架中使用参数中的deltaTime调用该函数。如果类已声明,但如果它刚刚添加到显示列表中,则此操作不起作用。 主类中的代码: package packageFoo{ import flash.display.MovieClip; import packageFoo.customMovieclip; public class Main extends MovieClip{

我有一个扩展MovieClip的类。这个类有一个update()函数,需要在每个新的框架中使用参数中的deltaTime调用该函数。如果类已声明,但如果它刚刚添加到显示列表中,则此操作不起作用。 主类中的代码:

package packageFoo{
    import flash.display.MovieClip;
    import packageFoo.customMovieclip;

    public class Main extends MovieClip{
        public function Main():void{
            var testMc:customMovieClip = new customMovieClip();
            addChild(testMc);
            testMc.update(dt);
        }
    }
}
这将输出正确的值,就好像我只是添加了它而没有引用它一样:

package packageFoo{
    import flash.display.MovieClip;
    import packageFoo.customMovieclip;

    public class Main extends MovieClip{
        public function Main():void{
            addChild(new customMovieclip());
            this.getChildAt(0).update(dt);
        }
    }
}
这使得编译时错误:1061:调用一个可能未定义的方法时通过引用静态类型flash.display:DisplayObject进行更新。
我无法真正引用“customMovieclip”,因为我需要多个。

它看起来像
这样。getChildAt(0)
不是
customMovieclip
。如果您的
Main
在设计时预先放置了组件,则可能会出现这种情况。要进行检查,请将
trace(this.numChildren)
作为
Main()
构造函数的第一行。此外,为了正确处理任何子类方法,您需要将
getChildAt()
返回的
DisplayObject
类型转换为正确的类型

(this.getChildAt(0) as customMovieClip).update(dt);

不过,如果您想在main类的多个函数中处理自定义MC,则使用类范围变量更好。

如果您试图避免在document类中引用自定义类,可以这样调用它:

this.getChildAt(0)["update"](dt);

(此.getChildAt(0)作为customMovieClip)
应被视为anit模式,因为它将引发类型错误并隐藏类型转换失败的事实
if(this.getChildAt(0)是customMovieClip){customMovieClip(this.getChildAt(0)).update(dt)}
更干净,避免了运行时错误。@FlorianSalihovic请看,即使是反模式,抛出的错误也表明程序员编码错误。一个正确的代码永远不会从内部抛出错误,因为一个独立的SWF模块中的一切都在程序员的完全控制之下。如果类型不匹配,我宁愿得到一个1009,也不愿发现我的游戏有一半因为不确定的原因停止工作。
customMovieClip(this.getChildAt(0)).update(dt)
会更好,因为你马上得到了正确的错误类型。在我的示例中,开发人员可以在else分支中响应意外类型。但是没有关系。