2010年2月9日 星期二

AS3反射

//簡單寫一個範例
package myFactory
{
      import flash.utils.Dictionary;   
      //↓從測試檔貼過來改寫貼錯
        private var _map:Dictionary = new Dictionary( );
     public class MyFactory
    {
       private var _map:Dictionary = new Dictionary( );
       public function MyFactory( )
      {
      }  

     //產生一個實體
      public function getInstance( key:Object):Objcet
      {
        
         var temp:Object = _map[key];
          if(!temp) return null;
          if(!_map[key]) return;
          return new temp( );
          return new _map[key];
      }

     //註冊類別
     public function register( key:Object , type:Object):Object
     {
          if(!type) return null;
           //這裡可以寫一些不想被註冊的類型

           //type如果是Class就直接記錄到_map ,不是就將物件反射成類別
           if(type is Class)
           {
                  return  _map[key] = type;
           }else
           {
                if(type is Object)
                {
                    //以下做反射
                    //取回物件的Class名稱
                    var s:String = flash.utils.getQualifiedClassName(type);
                    //取回類別參照
                    var classReference:Class = Class(flash.utils.getDefinitionByName(s));
                    return  _map[key] = classReference;
                }else
             {
                return null;
             }
       }
    }
       //移除註冊對象
        public function dell(key:Object ):Object
        {
             if( _map[key] )
             {
                    //清除掉索引,待記憶體回收
                    _map[key] = null;
                    delete _map[key];
                    return 0;
              }else{
                    return -1;
             }
         }  
   }
}
 
//來寫一個Mxml測試一下
<?xml version="1.0" encoding="utf-8"?>
<mx:Application applicationComplete="application1_applicationCompleteHandler(event)" xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" minWidth="1024" minHeight="768">
<mx:Script>
<![CDATA[
       import myFactory.MyFactory;
       import mx.controls.Button;
       import mx.events.FlexEvent;
      protected function application1_applicationCompleteHandler(event:FlexEvent):void
     {
             var fc:MyFactory= new MyFactory( );  
             var btn:Button = new Button( );
                   btn.label = "這是一個實體"; 
             var btnClass:Class = Button;
          //註冊,接受實體或類別,註冊用的Key可以寫一個conts以方便使用或防止出輸入錯誤。
          //實體註冊,內部會做 Class反射,傳回一個新的Button
            fc.register("btnInstance" ,btn);
         //類別註冊
           fc.register("btnClass" ,btnClass);

           this.hbox.addChild(fc.getInstance( "btnInstance" ) as DisplayObject);
           this.hbox.addChild(fc.getInstance( "btnClass" ) as DisplayObject);
           //驗證
           this.hbox.addChild(btn);
}
]]>
</mx:Script>
<mx:HBox id="hbox" />
</mx:Application>

反射也可以用於loader進來的swf檔當需與flash做結合非常方便。
//為什麼要使用工廠,因為可以避免直接去修改使用到工廠之類別的程式碼,以簡化程式,使用抽象類別或介面以超型態配合工廠。

沒有留言:

張貼留言