1

对不起,这可能是一个有点愚蠢的问题,但我正在尝试编写一个 Actionscript 2.0 类来处理加载 XML 数据,然后使其可供应用程序的其余部分访问。

然而,这是我第一次为任何不是 MovieClip 的东西编写类定义,我遇到了一个奇怪的错误。例如这里:

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();

}

最后一行,我尝试实例化 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();
}

}
4

1 回答 1

1

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

根据我的经验,它是这样的:

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

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

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

public var externals:External;

public function Main() {
    _root._quality = 'BEST';
    externals = new External();
    trace('----------------------------------------------');
}

这样,每个 Main 实例都会收到自己的 external 实例。这至少解决了您的问题,并且在涉及类/实例如何在编码语言中工作时会更加“正确”。

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

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

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

希望这是有道理的,我意识到解释我的意思有点困难......:o

于 2012-12-10T15:32:46.317 回答