actionscript-3 - 如果使用 Flash Builder 4.7 而不是 4.6,则基

从昨天开始,我一直在尝试将 ActionScript Mobile 项目从 Flash Builder 4.6 移植到 Flash Builder 4.7,但我遇到了一个可能是编译器错误的问题。在 FB 4.6 中,这有效:

温度:

package
{
    import flash.display.Sprite;

    public class Temp extends Sprite
    {
        public function Temp()
        {
            new StartMenu();
        }
    }
}

屏幕1.as:
package
{
    import flash.display.*;

    internal class Screen1 extends Sprite
    {
        private static var m_vScreens:Vector.<Screen1> = new Vector.<Screen1>();

        public function Screen1()
        {
            m_vScreens.push(this);

            onScreenSizeDetermined();return;
            var strFunction:String = "useSmallPortraitLayout";
            for each (var screen:Screen1 in m_vScreens)
            {
                trace(1)
                screen[strFunction]();
            }
        }

        protected function useSmallPortraitLayout():void
        {
        }

        private static function onScreenSizeDetermined():void
        {
            var strFunction:String = "useSmallPortraitLayout";
            for each (var screen:Screen1 in m_vScreens)
            {
                trace(2)
                screen[strFunction](); // Error thrown here in 4.7.
            }
        }
    }
}

开始菜单.as:
package
{
    public final class StartMenu extends Screen1
    {
        override protected function useSmallPortraitLayout():void
        {
        }
    }
}

但在 4.7 中,它不起作用。我回来的错误是这样的:
ReferenceError: Error #1069: Property useSmallPortraitLayout not found on StartMenu and
there is no default value.

话虽如此,这可以通过至少两种方式之一来解决:
  • 使用 Flash Builder 4.6
  • 注释掉 onScreenSizeDetermined();return; ,从而使用成员函数调用useSmallPortraitLayout() ,而不是静态函数。这不需要使用构造函数;它工作得很好,只要 Screen1正在调用useSmallPortraitLayout()来自几乎任何非静态方法。

  • 不幸的是,静态方法会失败,即使它是从构造函数外部和/或定时延迟调用的。我在 4.6 中没有特别记得的一件事,但我至少在 4.7 中看到了,使用不相关的类直接通过实例调用静态方法不会编译 - 它必须以静态方式完成在不相关的类中。并不是说我在真实代码中做那样的事情,但这确实让我怀疑静态和非静态之间的关系是否有意改变了。

    这可能只是特定于 FB 4.7 的一些微不足道的编译器错误,我会直接回到 4.6,但纯 ActionScript 库项目仅在 4.7 中直接受支持。 (这是一个移动项目,但我打算在解决方案中添加一个库项目。)

    需要注意的一点是,如果静态函数调用 useSmallPortraitLayout,则代码将无法在 FB 4.7 中编译。这边走:
    screen.useSmallPortraitLayout();
    

    它必须动态调用它才能编译。

    有一个足够简单的解决方法吗? 4.6 是否有一点语法上的怪异一直被忽略?出了什么问题,什么是好的解决方案/解决方法?

    更新

    如果最坏的情况发生,它似乎确实可以部分替换 Vector.<Screen1>Vector.<Function> ,然后只调用函数向量的成员,而不是调用 Screen1 成员的函数向量。 (这是从生产代码简化的。)但这只是一个后备。

    此外,我之前没有过多关注的事情(特别是就这个问题而言),但 BotMaster 引起了我的注意,在从 FB 4.6 到 FB 4.7 的过程中,我也从 AIR 3.1 升级到 AIR 3.4。

    最佳答案

    这更像是一个范围问题。 protected 方法只能在实例范围内调用,而不能在静态范围内调用。当然,将修饰符更改为 public 可以解决这里的问题。 PO 可能会争辩说,这里需要 protected ,但实际上,如果打算在该实例范围之外的实例上直接调用方法,那么从逻辑上讲,该方法需要是公共(public)的。

    顺便说一句,FB 4.6 编译器由使用的 AIR/FLEX SDK 提供,因此与使用相同 SDK 的 FB 4.7 的行为不会有所不同。

    关于actionscript-3 - 如果使用 Flash Builder 4.7 而不是 4.6,则基类中的静态函数不想调用子类上的成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28436110/

    相关文章:

    eclipse - 如何修复xtext上的简单错误?

    c# - MVC3网站编译器错误

    opencv - 使用 CUDA 支持构建 OpenCV transpose.cu 上的错误

    compiler-errors - Lazarus IDE-编译失败: Cannot open in

    c# - 为什么这种编译方式有所不同?

    c# - 根据文本框错误重新定义变量

    haskell - 实例化类时发生编译错误

    macos - AudioFileReadPackets错误-50

    sql - Microsoft SQL服务器

    compiler-errors - gfortran在编译文件上不输出ident工具