2011-10-05 81 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