Flash AS2.0:我能';除非在编译时,否则不能实例化一个类吗?有人能解释一下这是什么意思吗?

Flash AS2.0:我能';除非在编译时,否则不能实例化一个类吗?有人能解释一下这是什么意思吗?,flash,actionscript,actionscript-2,Flash,Actionscript,Actionscript 2,很抱歉,这可能有点愚蠢,但我正在尝试编写一个ActionScript2.0类,该类处理XML数据的加载,然后使应用程序的其余部分可以访问它 然而,这是我第一次为非电影唇编写类定义,我遇到了一个奇怪的错误。例如: class Main extends SEBanner { public function Main() { _root._quality = 'BEST'; trace(_root._quality + ' SWF Quality Setting.'); tr

很抱歉,这可能有点愚蠢,但我正在尝试编写一个ActionScript2.0类,该类处理XML数据的加载,然后使应用程序的其余部分可以访问它

然而,这是我第一次为非电影唇编写类定义,我遇到了一个奇怪的错误。例如:

class Main extends SEBanner {

public function Main() {
    _root._quality = 'BEST';
    trace(_root._quality + ' SWF Quality Setting.');
    trace('Banner main object instantiated. Ready to run.')
    trace('Width of banner: ' + bannerWidth());
    trace('Height of banner: ' + bannerHeight());
    trace('Banner aspect ratio: ' + bannerAspectRatio());
    trace('----------------------------------------------');
}

public var externals:External = new External();

}
最后一行,我尝试实例化外部类(之所以这样命名,是因为它将处理外部提供的Flash变量以及XML),被编译器锁定,它给了我一个错误,翻译为(我使用的是日语版本的Flash)“类实例变量只能在编译时实例化。”

我很困惑,因为据我所知,如果代码正在编译,那就是编译时。这段代码应该还可以,因为在我编译它时出现了错误

奇怪

谢谢

党卫军

更新:这里是(剥离,以避免显示任何机密信息)外部类进行比较:

import mx.xpath.XPathAPI;

class External {

private var _rawXML = new XML();
private var _xmlLocation:String = '';


public function External() {
    trace('Loading external information...');

    _rawXML.ignoreWhite = true;

    _rawXML.onLoad = function(success:Boolean) {
        if (success) {
            trace('XML data was successfully loaded.')
            initXML();
        } else {
            trace('There was an error loading the XML. Please check the XML file.');
        }
    }

    preLoadXML();
}



private function loadLocalXML():Void {
    getXML();
}


private function loadNetworkXML():Void {        
    getXML();
}

function getXML():Void {
    if ( _rawXML.load( _xmlLocation ) ) {
        trace('XML loading...');
    } else {
        trace('I\'m having difficulty finding the XML. You might want to check your data source.')
    }
}

function initXML():Void {
    _root._ary = XPathAPI.selectNodeList(this.rawXML, eventPath);
    _root._total = _ary.length;

    _root.siteLink = getXRedirect();
}

}
英文错误是:“类的实例变量只能初始化为编译时常量表达式。”

根据我的经验是这样的:

将类定义视为关于如何创建该类的每个实例的“蓝图”

在您的示例中,定义“Main”的每个实例都应该包含外部类的定义,然后创建该类的实例并将其绑定到变量externals[Main.externals]。这里的问题是代码[Main的定义]只运行一次[静态,在启动期间,当它将所有定义加载到内存中时],因此Main的每个后续实例将始终链接到“External”的同一个实例。由于您在代码中没有提到希望出现这种情况,因此出现了此错误

所以,您可能想做的是,在Main的构造函数中,创建External的实例--

这样,Main的每个实例都将接收自己的外部实例。 这至少解决了您的问题,而且对于类/实例在编码语言中的工作方式更为“正确”

另一方面,如果希望Main的所有实例都链接到External的同一个实例,则只需编写

public static var externals:External = new External();

public function Main() {
    _root._quality = 'BEST';
    trace("external=" + externals);
    trace('----------------------------------------------');
}
希望这有意义,我意识到要解释我的意思有点困难…:英文错误是:“类的实例变量只能初始化为编译时常量表达式。”

根据我的经验是这样的:

将类定义视为关于如何创建该类的每个实例的“蓝图”

在您的示例中,定义“Main”的每个实例都应该包含外部类的定义,然后创建该类的实例并将其绑定到变量externals[Main.externals]。这里的问题是代码[Main的定义]只运行一次[静态,在启动期间,当它将所有定义加载到内存中时],因此Main的每个后续实例将始终链接到“External”的同一个实例。由于您在代码中没有提到希望出现这种情况,因此出现了此错误

所以,您可能想做的是,在Main的构造函数中,创建External的实例--

这样,Main的每个实例都将接收自己的外部实例。 这至少解决了您的问题,而且对于类/实例在编码语言中的工作方式更为“正确”

另一方面,如果希望Main的所有实例都链接到External的同一个实例,则只需编写

public static var externals:External = new External();

public function Main() {
    _root._quality = 'BEST';
    trace("external=" + externals);
    trace('----------------------------------------------');
}

希望这有意义,我意识到要解释我的意思有点困难…:真奇怪。您需要提供外部类构造函数和定义,也许它是一个在内部有自己的实例化例程的单例类,而该类会向您抛出错误。或者像Math这样的静态类型的类,你不能实例化Math类的一个变量,你已经被这个问题击中了。这也可能是一个翻译错误。真奇怪。您需要提供外部类构造函数和定义,也许它是一个在内部有自己的实例化例程的单例类,而该类会向您抛出错误。或者像Math这样的静态类型的类,你不能实例化Math类的一个变量,你已经被这个问题击中了。这也可能是一个翻译错误。通过进一步测试,我意识到我的假设部分错误,因为我认为这与类是一个引用对象这一事实有关,而事实并非如此。不过,解决方案仍然有效,只是其背后的推理部分错误。真正的问题与actionscript“幕后”经历的所有预编译阶段有关。可能链接到静态构造函数/类定义,并且您尝试实例化的动态类在特定时间没有加载到内存中,因为您告诉AS它应该是动态绑定。但这不是问题,因为您应该告诉变量是静态的(在Main的所有实例中共享)或者Main的每个实例都应该有自己的定义(在Main的构造函数中创建外部实例)。这是一个非常彻底和详细的回答。谢谢但我有一个问题:我在实例化时的推理是,我希望变量“externals”在整个主类中都可用,而不仅仅是在构造函数中。实际上,我真正想要的是它在整个项目中始终可用,但我不确定如何做到这一点,所以我现在正在每个类中创建需要使用它的实例。有没有一种方法可以做到这两个呢?还有,这两个修复都没有