【问题标题】:Call custom method as Display Object AS3调用自定义方法作为显示对象 AS3
【发布时间】:2013-11-01 22:41:58
【问题描述】:

我有一个扩展 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”,因为我想要多个。

【问题讨论】:

    标签: actionscript-3 flash class inheritance reference


    【解决方案1】:

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

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

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

    【讨论】:

    • (this.getChildAt(0) as customMovieClip) 应该被视为一种反模式,因为它会引发类型错误并隐藏类型转换失败的事实。 if (this.getChildAt(0) is customMovieClip) {customMovieClip(this.getChildAt(0)).update(dt)} 更简洁,避免了运行时错误。
    • @FlorianSalihovic 请看,即使它是反模式,抛出的错误也表明程序员编写了错误的代码。正确的代码永远不会从自身内部抛出错误,因为独立 SWF 模块中的所有内容都在程序员的完全控制之下。如果类型不匹配,我更愿意得到 1009,而不是发现我的一半游戏由于未确定的原因停止工作。
    • customMovieClip(this.getChildAt(0)).update(dt) 会更好,因为您会立即得到正确类型的错误。在我的示例中,开发人员可以在 else 分支中响应意外类型。但是……没关系。
    【解决方案2】:

    如果你想避免在文档类中引用自定义类,你可以这样称呼它:

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

    【讨论】:

      猜你喜欢
      • 2011-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多