ActionScript では型付き配列 (typed array) がサポートされていない。もし実装するなら、以下のようになるだろう。要素を追加する際に constructor プロパティでふるいにかけている。
Typed Array
class TypedArray { private var array:Array = null; private var type:Function = null; /** * コンストラクタ * @param type 要素の型 */ public function TypedArray(type:Function) { this.array = new Array(); this.type = type; } /** * アイテムを追加する * @param item 追加するアイテム */ public function push(item:Object):Void { if (item.constructor == this.type) { this.array.push(item); } else { throw new Error("Error : Invalid type."); } } //その他のメソッド... }
しかし、"そこまでする必要がない" プロジェクトでは、Array を使った方が生産性が高いだろう。 同じ型の要素を追加することを暗黙の了解として、要素を取り出す際に以下の項目に注意すれば、幾らか堅いコーディングができる。
- 配列アクセスをしない
- 取り出す際に型を指定する
配列アクセスをしない
配列アクセスは利便性が高い反面、配列の要素が Object として扱われるため、コンパイルエラーが検出されないというデメリットがある。
var hoge:Hoge = new Hoge(); var array:Array = new Array(); array.push(hoge); array[0].boo();
上記例の場合、Hoge クラスに boo というメソッドが無くてもエラーは出ない。
取り出す際に型を指定する
配列から要素を取り出す際に型を指定すれば、以後、要素を意図する型として扱うことができる。
var hoge:Hoge = new Hoge(); var array:Array = new Array(); array.push(hoge); var item:Hoge = array[0]; item.boo(); //エラー
もしくは型キャストで
var hoge:Hoge = new Hoge(); var array:Array = new Array(); array.push(hoge); Hoge(array[0]).boo(); //エラー
このようにすれば、コンパイル時にエラーを拾うことができる。