Flash AS2.0:我能';除非在编译时,否则不能实例化一个类吗?有人能解释一下这是什么意思吗?
很抱歉,这可能有点愚蠢,但我正在尝试编写一个ActionScript2.0类,该类处理XML数据的加载,然后使应用程序的其余部分可以访问它 然而,这是我第一次为非电影唇编写类定义,我遇到了一个奇怪的错误。例如: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
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”在整个主类中都可用,而不仅仅是在构造函数中。实际上,我真正想要的是它在整个项目中始终可用,但我不确定如何做到这一点,所以我现在正在每个类中创建需要使用它的实例。有没有一种方法可以做到这两个呢?还有,这两个修复都没有