チェンジセット 878

差分発生行の前後
無視リスト:
コミット日時:
2008/07/25 12:43:16 (4 年前)
コミッタ:
michi
ログメッセージ:

abstraction, singleton, multiSingleton メソッドを追加

ファイル:

凡例:

変更無し
追加
削除
更新
コピー
移動
  • as3/Utils/src/org/libspark/utils/ClassUtil.as

    r804 r878  
    1818package org.libspark.utils  
    1919{ 
     20import flash.utils.Dictionary; 
    2021import flash.utils.getDefinitionByName; 
    2122 
     
    5253        } 
    5354         
     55        /** 
     56         * クラスのコンストラクタ内で呼び出すことで、そのクラスを抽象クラスのように振舞わせます. 
     57         * このメソッドは、必ずクラスのコンストラクタ内で使用してください。 
     58         * このメソッドを使用すると、そのクラスは直接インスタンスを作成できなくなります。 
     59         * インスタンスを作成するためには、このクラスを継承したサブクラスを作る必要があります。 
     60         *  
     61         * @param       instance 必ず this を指定します 
     62         * @param       klass 現在のクラスを指定します。 
     63         * @example 以下のコードでは AbstractTest クラスと、これを継承した AbstractSubClass を作成します。 
     64         * AbstractTest クラスからインスタンスを作成しようとすると ArgumentError が throw されますが、 
     65         * AbstractTest クラスを継承した AbstractSubClass は、正常にインスタンスを生成することができます。 
     66         * <listing> 
     67         * import org.libspark.utils.ClassUtil; 
     68         * public class AbstractTest  
     69         * { 
     70         *     public function AbstractTest()  
     71         *     { 
     72         *         ClassUtil.abstraction(this, AbstractTest); 
     73         *     } 
     74         *      
     75         *     public function testCall():void 
     76         *     { 
     77         *         trace("create instance ok!"); 
     78         *     } 
     79         * } 
     80         *  
     81         * public class AbstractSubClass extends AbstractTest 
     82         * { 
     83         *     public function AbstractSubClass()  
     84         *     { 
     85         *         testCall(); 
     86         *     } 
     87         * } 
     88         * </listing> 
     89         */ 
     90        public static function abstraction(instance:Object, klass:Class):void 
     91        { 
     92                if (instance.constructor == klass) throw new ArgumentError 
     93                        ("Error #2012: "+getClassName(instance)+"$ クラスをインスタンス化することはできません。"); 
     94        } 
     95         
     96        /** 
     97         * クラスのコンストラクタ内で呼び出すことで、そのクラスのインスタンス数を制限します。 
     98         * このメソッドは、必ずクラスのコンストラクタ内で使用してください。 
     99         * このメソッドを使用すると、コンストラクタは 1 度だけ呼び出すことができるようになります。 
     100         *  
     101         * @param       instance 必ず this を指定します 
     102         * @example 以下のコードでは SingletonTest のコンストラクタは 1 度しか呼び出せなくなります。 
     103         * 通常 getInstance() メソッド等を作成して併用しますが、サンプルでは省略しています。 
     104         * <listing> 
     105         * import org.libspark.utils.ClassUtil; 
     106         * public class SingletonTest  
     107         * { 
     108         *     public function SingletonTest()  
     109         *     { 
     110         *         ClassUtil.singleton(this); 
     111         *     } 
     112         * } 
     113         * </listing> 
     114         */ 
     115        public static function singleton(instance:Object):void 
     116        { 
     117                if ( _SingletonContainer[instance.constructor] ) throw new ArgumentError 
     118                        ("Error #2012: "+getClassName(instance)+" クラスをインスタンス化することはできません。"); 
     119                else _SingletonContainer[instance.constructor] = true; 
     120        } 
     121         
     122        /** 
     123         * クラスのコンストラクタ内で呼び出すことで、そのクラスのインスタンス数を制限します。 
     124         * このメソッドは、必ずクラスのコンストラクタ内で使用してください。 
     125         * このメソッドを使用すると、コンストラクタは指定回数まで呼び出すことができるようになります。 
     126         *  
     127         * @param       instance 必ず this を指定します 
     128         * @param       maxCount コンストラクタの呼び出し可能数 
     129         * @example 以下のコードでは MultiSingletonTest のコンストラクタは 3 度だけ呼び出すことができます。 
     130         * 通常 getInstance() メソッド等を作成して併用しますが、サンプルでは省略しています。 
     131         * <listing> 
     132         * import org.libspark.utils.ClassUtil; 
     133         * public class MultiSingletonTest  
     134         * { 
     135         *     public function MultiSingletonTest()  
     136         *     { 
     137         *         ClassUtil.multiSingleton(this, 3); 
     138         *     } 
     139         * } 
     140         * </listing> 
     141         */ 
     142        public static function multiSingleton(instance:Object, maxCount:uint=1):void 
     143        { 
     144                var cnst:Object = instance.constructor; 
     145                if ( _SingletonContainer[cnst] ) 
     146                        if (_SingletonContainer[cnst].length < maxCount) 
     147                                _SingletonContainer[cnst].push([instance]); 
     148                        else throw new ArgumentError 
     149                                ("Error #2012: "+getClassName(instance)+" クラスをインスタンス化することはできません。"); 
     150                else _SingletonContainer[cnst] = [instance]; 
     151        } 
     152         
     153         
     154         
     155        //---------------------------------------------------- 
     156        // PRIVATE PROPERTIES 
     157        //---------------------------------------------------- 
     158         
     159        private static var _SingletonContainer:Dictionary = new Dictionary(true); 
     160        private static var _MultiSingletonContainer:Dictionary = new Dictionary(false); 
     161         
    54162         
    55163}