as演算子の使いどころ

キャスト(型変換)は、オブジェクト指向プログラミングには欠かせない。
AS3にはキャストの方法が2種類ある。

()を使ったキャスト

変換したいインスタンスを、変換したい型のあと()でくくる。
キャストに失敗すると例外(Error)を投げる。
例外をキャッチしないとランタイムエラーになる。

trace(MovieClip(new Sprite()));
//output
TypeError: Error #1034: 強制型変換に失敗しました。flash.display::Sprite@4c38ee49 を flash.display.MovieClip に変換できません。

as 演算子を使ったキャスト

asの前に、「変換したいインスタンス」、後に「変換したい型」で記述する。
キャストに失敗するとnullを返す。

trace(new Sprite() as MovieClip);
//output
null

ところで、この2つはどう使い分けるべきなんだろう?

()を使ったキャストを使う局面は、「キャストできることが前提の処理を書くとき」
つまり、アプリケーションの実行上、キャストが失敗するのは何らかの異常事態が起こっているときの場合で、
as演算子を使う局面は、キャストに成功するか失敗するかコンパイル時には予想できない場合なのかな?

例えば、コレクション内に、いろいろな動物オブジェクトがあり、
その中のTigerに対して処理を実行したい場合、

()を使ったキャスト

function giveFoodToTiger(zoo:Array)
{
    for(var i:int = 0; i < zoo.length; i ++)
    {
        try
        {
            var tiger:Tiger = Tiger(zoo[i]);
        }
        catch(e)
        {
            //クリティカルなエラーが発生!エラー処理を実行
            tiger = new Tiger();
        }
        finally
        {
            //トラにだけ餌をあげる
            tiger.giveFood();
        }
        
    }
}

as演算子を使ったキャスト

function giveFoodToTiger(zoo:Array)
{
    for(var i:int = 0; i < zoo.length; i ++)
    {
        //トラにだけ餌をあげる
        var tiger:Tiger = zoo[i] as Tiger;
        if(tiger) tiger.giveFood();
    }
}

()を使ったキャストは、コレクション内の動物オブジェクトが「トラだけ」なのを想定していて、Tigerクラスでなければ困る場合に使える。
as演算子を使ったキャストは、コレクション内の動物オブジェクトが「いろんな動物」なのを想定していて、その中の特定オブジェクトだけに何かしたい場合に使える。

あと、未検証だけど、
as演算子を使ったキャストの方が高速らしい。

カテゴリー: ActionScript3, AS3fromAS2 パーマリンク

as演算子の使いどころ への1件のフィードバック

  1. ラボブログ のコメント:

    ActionScript 3 でイベントリスナ(ボタンアクション)

    スパイスラボ神部です。 ひとつ前のエントリーでは、無事ドキュメントクラスを関連づけることが出来ました。パチパチパチ。 では次は Action Script…

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です