如何在静态上下文中使用内部类?

时间:2012-05-03 18:38:00

标签: actionscript-3 flash

我想使用内部类来创建对象层次结构,以避免混乱我当前项目的API。基本的想法是使用这样的东西:

package foo {
    public class Bar {
        public static const BLUBB:Blubb = new Blubb();
        public static const ZONK:Zonk = new Zonk();
    }
}
class Blubb {
    public const GNARF:Gnarf = new Gnarf();
    public const BLUBB_BLAH:String = "blubb-blah";
}
class Gnarf {
    public const GNARF_BLAH:String = "gnarf-blah";
}
class Zonk {
    public const ZONK_BLAH:String = "zonk-blah";
}

以便我可以像someFunction(Bar.BLUBB.GNARF.GNARF_BLAH);

一样使用它

然而,显然ActionScript不太喜欢这个构造(尽管FDT5编译它而没有给出一个关于它的frell)并且给了我以下运行时错误:

Exception fault: TypeError: Error #1007: Instantiation attempted on a non-constructor.
    at foo::Bar$cinit()
    at global$init()
    at ...

使用堆栈跟踪的其余部分导致我第一次尝试访问Bar的任何静态常量。

是不是真的不可能以这种方式使用内部类或者我只是错过了一些秘密伏都教?

1 个答案:

答案 0 :(得分:3)

我无法按照您的意愿使用它,但我发现了一些可能有用的东西:

package foo {
    public class Bar {
        public const BLUBB:Blubb = new Blubb();
        public const ZONK:Zonk = new Zonk();
    }
}
class Gnarf {
    public const GNARF_BLAH:String = "gnarf-blah";
}
class Blubb {
    public static const GNARF:Gnarf = new Gnarf();
    public const BLUBB_BLAH:String = "blubb-blah";
}
class Zonk {
    public const ZONK_BLAH:String = "zonk-blah";
}

我不得不为Bar的变量取出静态修饰符,但我发现只要 Gnarf定义在Blubb之上,我就可以向Blubb.GNARF 添加“static”。基于此,我尝试将所有三个内部类移到包定义之上,但事实证明这是不允许的。 (另外,你不能直接从另一个文件访问内部类,所以在其中一个文件中有一个静态变量本身并不有用。)

我也尝试将Bar.BLUBB作为静态var并在静态初始化块中初始化而不是内联,但这没有任何区别。我想如果你想为某个静态变量使用某个类类型,你必须在一个单独的文件中定义该类类型。