※※※ 1000622更新 : 目前發覺這個測試, 是在錯誤條件下得到的結果, 如果搬開child.swf到另一目錄, 就有錯誤發生. 暫時保留這個主題.
(一) 1000621_Main_1.fla 搭配主要類別(文件類別) Main_1_1000621.as,其元件庫中則有Ball元件綁定外部類別Ball.as,以上匯出為1000621_Main_1.swf。透過Main_1_1000621.as裡面的程式碼將載入外部的child.swf
(二) 被載入的外部swf 為child.swf, 由child.fla搭配Child.as所匯出.
(三) 1000621_Main_1.swf 載入child.swf後。
由於, child.swf 與 1000621_Main_1.swf 位於同一網域,且未以LoaderContext類別做其它設定
被載入的child.swf 與載入器所在的1000621_Main_1.swf,完成載入後,預設將位於同一安全性網域與同一應用程式網域
*** 藉由將載入的 SWF 檔置於相同的應用程式網域中,便可以直接存取其類別 ***
*** 在載入器swf和被載入的swf之間,彼此所定義的類別為彼此可見 ***
(四) 所以,在Main_1_1000621文件類別中,可以直接調用Child類別建構式來建立其實體。
var childObj:Child = new Child();
並調用其welcome()方法 -
var message:String = childObj.welcome("Alice");
(五) 在Child.as中,可以直接調用Ball類別建構式,建立其實體。
var myParentBall:Ball = new Ball(275,200);
並調用其ballFunc()方法 -
myParentBall.ballFunc();
(六) 以上, 質疑的是,是因為所解釋之原因,而能彼此擁有類別的可見度 ???
還是,因為命名空間的關係,而可被存取 ???
Main_1_1000621
package {
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.*;
import flash.events.EventDispatcher;
import flash.net.URLRequest;
public class Main_1_1000621 extends Sprite {
public static const LOADED:String = "loaded";
public var testVar:String;
private var ldr:Loader;
public function Main_1_1000621() {
this.testVar = "abc";
ldr = new Loader();
var req:URLRequest = new URLRequest("Child.swf");
/*將外部Child.swf載入到目前應用程式網域*/
/* ***藉由將載入的 SWF 檔置於相同的應用程式網域中,便可以直接存取其類別。*** */
/*var ldrContext:LoaderContext = new LoaderContext(false,ApplicationDomain.currentDomain);*/
ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
ldr.load(req);
}
private function completeHandler(event:Event=null):void {
trace("@Main_1_1000621 / completeHandler() / event.target.content : " + event.target.content);
/*取得ldr載入之Child類別實體 - A法*/
/*var childObj:Child = event.target.content as Child; */
/*載入完成後, 建構一個Child類別實體, 指定給childObj - B法*/
var childObj:Child = new Child();
this.addChild(childObj);
/*調用childObj實體的welcome()方法, */
var message:String = childObj.welcome("Alice");
trace("@Main_1_1000621 / completeHandler() / message : " + message);// Hello, Alice
/*載入完成後發送自訂事件*/
var loadedEvent:Event = new Event(LOADED);
childObj.dispatchEvent(loadedEvent);
trace("@Main_1_1000621 / completeHandler() / this.dispatchEvent(loadedEvent) : " + this.dispatchEvent(loadedEvent));
}
public function hello():void{
trace("@Main_1_1000621 / hello() : Hello!!! Baby!!!");
}
}
}
Child
package {
import flash.display.Sprite;
import flash.events.Event;
import flash.system.ApplicationDomain;
public class Child extends Sprite {
public var childVar:String;
public function Child() {
this.childVar = "@Child : I am from ChildClass";
/*偵聽Main_1_1000621.LOADED 之載入完成事件*/
this.addEventListener(Main_1_1000621.LOADED,loadedHandler);
this.addEventListener(Event.ADDED_TO_STAGE,addedToStage);
return;
}
public function loadedHandler(event:Event):void{
trace("@Child / loadedHandler() / event.type : " + event.type);
/*取得父類別實體*/
var myParent:Main_1_1000621 = this.parent as Main_1_1000621;
trace("@Child / loadedHandler() / myParent : " + myParent);
/*調用父類實體的hello()方法*/
myParent.hello();
/*trace(myParent.testVar);*/
return;
}
public function addedToStage(event:Event):void{
this.removeEventListener(Event.ADDED_TO_STAGE,addedToStage);
this.addEventListener(Event.REMOVED_FROM_STAGE,removedFromStage);
/*Ball類別為1000621_Main_1.fla元件庫中Ball元件所綁定外部自訂類別*/
/*由於, child.swf 與 1000621_Main_1.swf 位於同一網域, 且未以LoaderContext類別做其它設定*/
/*被載入的child.swf 與載入器所在的1000621_Main_1.swf, 完成載入後, 預設將位於同一安全性網域與同一應用程式網域*/
/* ***藉由將載入的 SWF 檔置於相同的應用程式網域中,便可以直接存取其類別。*** */
/*因此,在這裡Child類別中,可以直接調用Ball類別建構式,建立其類別實體, 並調用Ball類別實體方法*/
var myParentBall:Ball = new Ball(275,200);
myParentBall.ballFunc();
this.parent.addChild(myParentBall);
return;
}
public function removedFromStage(event:Event):void{
this.removeEventListener(Event.REMOVED_FROM_STAGE,removedFromStage);
return;
}
public function welcome(_name:String):String {
return "Hello, " + _name;
}
}
}
Ball
package {
import flash.display.SimpleButton;
import flash.events.Event;
public class Ball extends SimpleButton {
public var thisX:Number;
public var thisY:Number;
public function Ball(_x:Number,_y:Number) {
this.addEventListener(Event.ADDED_TO_STAGE,addedToStage);
this.thisX = _x;
this.thisY = _y;
return;
}
public function addedToStage(event:Event):void{
this.removeEventListener(Event.ADDED_TO_STAGE,addedToStage);
this.addEventListener(Event.REMOVED_FROM_STAGE,removedFromStage);
this.x = this.thisX;
this.y = this.thisY;
return;
}
public function removedFromStage(event:Event):void{
this.removeEventListener(Event.REMOVED_FROM_STAGE,removedFromStage);
return;
}
/*此例, Ball類別的這個ballFunc()方法,將在child.swf 被1000621_Main_1.swf 載入後,被Child類別實體調用*/
public function ballFunc():void{
trace("@Ball / ballFunc : I am from Ball Class");
}
}
}




沒有留言:
張貼留言