2010年2月23日 星期二

Aggregation

方便使用聚合的物件。
在建構式中傳入要聚合的物件,
參數越後面的,優先序越高。



Aggregation
package tw.right929.proxy
{
    import flash.utils.Proxy;
    import flash.utils.flash_proxy;
    
    use namespace flash_proxy
    
    /**
     * 方便使用聚合的物件。
     * 在建構式中傳入要聚合的物件,
     * 參數越後面的,優先序越高。
     */
    public dynamic class Aggregation extends Proxy
    {
        private var _collection:Array    =    new Array();
        
        public function Aggregation(...objects)
        {
            super();
            _collection.push.apply(_collection , objects);
        }
        
        /**
         * 尋找聚合物件之中是否有這個屬性。
         */
        override flash_proxy function hasProperty(name:*):Boolean
        {
            for(var i:int = _collection.length-1 ; i>=0 ; i--)
            {
                if(_collection[i].hasOwnProperty(name))
                    return true;
            }
            return false;
        }
        
        /**
         * 不能增加新的屬性,只能設定已存在聚合物件中的屬性。
         */
        override flash_proxy function setProperty(name:*, value:*):void
        {
            for(var i:int = _collection.length-1 ; i>=0 ; i--)
            {
                if(_collection[i].hasOwnProperty(name))
                {
                    if(_collection[i][name] == value)
                        return;
                    _collection[i][name]    =    value;
                    return;
                }
            }
        }
        
        /**
         * 傳回已存在聚合物件之中的屬性。
         */
        override flash_proxy function getProperty(name:*):*
        {
            for(var i:int = _collection.length-1 ; i>=0 ; i--)
            {
                if(_collection[i].hasOwnProperty(name))
                    return _collection[i][name];
            }
            return undefined;
        }
        
        /**
         * 呼叫聚合物件之中的方法。
         */
        override flash_proxy function callProperty(name:*, ... rest):*
        {
            for(var i:int = _collection.length-1 ; i>=0 ; i--)
            {
                if(_collection[i].hasOwnProperty(name))
                    return _collection[i][name].apply(this , rest);
            }
            return undefined;
        }
    }
}

測試
<?xml version="1.0" encoding="utf-8"?>
<s:Application creationComplete="init()" xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/halo" minWidth="1024" minHeight="768">
    <fx:Script>
        <![CDATA[
            import tw.right929.proxy.AdvancedProxy;
            import tw.right929.proxy.Aggregation;
            
            private function init():void
            {
                var childArr:Array    =    [];
                var itemArr:Array    =    [];
                var point:Point        =    new Point(0 , 0);
                
                var childProxy:AdvancedProxy    =    new AdvancedProxy();
                childProxy.$super    =    childArr;
                childProxy.$alias("push" , "addChild");
                var itemProxy:AdvancedProxy        =    new AdvancedProxy();
                itemProxy.$super    =    itemArr;
                itemProxy.$alias("push" , "addItem");
                
                var agg:Aggregation    =    new Aggregation(childProxy , itemProxy , point);
                agg.addChild("c1" , "c2");
                agg.addItem("i1" , "i2");
                agg.x    =    10;
                agg.y    =    20;
                
                trace(childArr);
                trace(itemArr);
                trace(point.x);
                trace(point.y);
                trace(agg.x);
                trace(agg.y);
            }
        ]]>
    </fx:Script>
</s:Application>

沒有留言:

張貼留言

追蹤者