2011-10-05 85 views
1

全部,AS3:如何从外部.as类文件编译SWF?

在我正在构建的Flash应用程序中,我有一个将加载各种“子”SWF的“主”SWF文件。

所有用于主SWF和子SWF的AS3代码均包含在外部.as类文件中。

换句话说,每部电影都有它自己的文档类.as文件。

对于所有常见元素(e..g,UI按钮和控件),还有许多.as类文件。因此 - 例如 - 我的主SWF和所有子SWF都使用“MyCommandButton”类;此类的代码位于MyCommandButton.as中,所有SWF参考(导入)。

这是我不明白。

比方说,在MyCommandButton.as的代码绘制是红色按钮。

首先,我编译子SWF文件的ALL

接下来,我改变MyCommandButton.as,以便它绘制按钮蓝色,而不是红色。

然后,我编译了主SWF。

当我运行的应用程序(main.swf中),我会预计所有主SWF的按钮是蓝色(因为那个时候的main.swf编译什么MyCommandButton.as规定),以及所有子SWF文件的按钮将红色(因为这时候他们编译什么MyCommandButton.as指定)。

相反,按钮ALL是蓝色的,这意味着我所做的更改MyCommandButton.as影响了所有子SWF,即使我没有重新编译它们。

这是为什么?有没有简单的解释为什么会发生这种情况?

非常感谢提前!

回答

4

这是由于Flash处理加载的字节码的方式。具体来说,查看ApplicationDomain文档。

除系统域外,每个应用程序域都有一个关联的父域。主应用程序的应用程序域的父域是系统域。加载的类只有在父类尚未定义它们时才被定义。你不能用新的定义覆盖已加载的类定义。

请注意“加载的类只有在父类尚未定义它们时才定义”部分。主SWF(父ApplicationDomain)中已存在子SWF的MyCommandButton类,因此不会使用它。

这对防止黑客行为尤为重要。想想如果你可以将你的SWF注入到别人的动态应用程序中,并开始重写他们所有的类,那么可能性就是这样。

http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7e07.html

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/system/ApplicationDomain.html

+0

这是一个*真棒*答案 - 感谢,meddlingwithfire!这也很有趣 - 我从黑客角度理解,为什么一个加载的(子)SWF不应该能够重写父类的类。但是,我错误地认为每个SWF都是独立的。因此 - 父级可以具有其“classA”版本,并且加载的SWF可以具有其自己的(不同)版本的“classA”。事实上,它的运作方式是一个非常显着的好处。我认为,在确定子SWF是否引用相同的类定义时,它会使用完整的名称空间? – mattstuehler

+0

每个SWF都非常独立 - 正如您通过自己运行每个SWF所看到的那样。当您开始将SWF加载到其他SWF中时,只会添加一些额外的安全规则。更正名称空间 - 检查类时会考虑类名称空间。所以,父母可以在默认名称空间中定义“MyCommandButton”,孩子可以定义“child.MyCommandButton”,并且不会有冲突。另外 - 如果您接受此答案,请将其标记为答案。 :) – meddlingwithfire