| | 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 | |
|---|