サイトトップ

Director Flash 書籍 業務内容 プロフィール

Macromedia Flash非公式テクニカルノート

オブジェクトのキャスト

ID: FN0504001 Product: Flash

Platform: All
Version: Flash MX 2004

ActionScript 2.0では、あるデータ型を他のデータ型にキャストすることができます。Flashが用いるキャスト演算子は、関数呼出しのかたちを取ります。これは、ECMAScript第4版提案に規定された「明示的な型変換」(explicit coercion)[*1]に合致します。キャストを行うことにより、オブジェクトが指定された型であることを宣言できます。すると、型チェックが行われるとき、コンパイラはオブジェクトの本来の型には存在しないプロパティ一式が備わっているものとして、そのオブジェクトを扱います。これはたとえば、オブジェクトの配列をループ処理するとき、個々のオブジェクトの型は異なっても、基本となる型を共有するという場合に便利です。

[訳者注*1] ECMAScript第4版提案は、「明示的な型変換」(Explicit Coercions)の項で、つぎのように述べます。

明示的な型変換を実行するには、型を関数として用い、その引数に値を渡します。

明示的な強制型変換は暗黙のそれに比べてより積極的な型変換を行う。明示的な強制型変換を行うには、型(type)を関数として使用し、変換する値(value)を引数として渡します。

type(value)

たとえば、Integer(258.1)(訳者注: ActionScriptにはこの関数は存在しません)は整数 258 を返し、String(2+2==4)は文字列"true"を返します。

valueがすでにtypeのメンバであれば、明示的な変換を行うとvalueがそのまま返されます。valueがtypeに暗黙の型変換できるときには、明示的な型変換により暗黙の型変換を行った結果が返されます。それ以外の場合は、明示的な型変換は、typeの明示的変換マップを用います。

キャストのシンタックスは、type (item)です。すると、itemのデータ型がtypeであるものとして、コンパイラに処理させることができます。キャストは、実質的に関数呼出しです。ランタイム時にキャストできなかった場合には、呼出された関数はnullを返します(Flash Player 7以降でパブリッシュされたファイルの場合。Flash Player 6でパブリッシュされたファイルでは、キャストできなかったときのランタイムのサポートはありません[*2])。キャストが正しく行われると、呼出された関数は元のオブジェクトを返します。しかし、コンパイラがランタイム時にキャストできるかどうかを判定できず、コンパイル時のエラーを発生しない場合があります。以下のコードは、その例を示します[*3]。

function bark(myAnimal:Animal) {
   var foo:Dog = Dog(myAnimal);
   foo.bark();
}

var curAnimal:Animal = new Dog();
bark(curAnimal);   // 動作する
curAnimal = new Cat();
bark(curAnimal);   // 動作しない


[訳者注*2] Flash Player 6では、キャストできなくても、元のオブジェクトを返します。

var myValue:Object = 1;
trace(MovieClip(myValue));
// [出力]
// Flash Player 7書出しの場合
null
// Flash Player 6書出しの場合
1

[訳者注*3] DogとCatの各クラスは、Animalクラスを継承し、単純なサンプルとしてはつぎのように定義されているものと考えられます。

// ActionScript 2.0クラス定義ファイル: Animal.as
class Animal {}

// ActionScript 2.0クラス定義ファイル: Dog.as
class Dog extends Animal {
   function bark() {
     trace("ワン!");
   }
}

// ActionScript 2.0クラス定義ファイル: Cat.as
class Cat extends Animal {}

この中で、コンパイラに対して、fooがDogオブジェクトだと宣言しました。そのため、コンパイラは、foo.bark();(訳者注: 原文に「temp.bark();」とあるのは誤りか、そうでなくても誤解を招きやすい記述でしょう)がステートメントとして問題ないものとみなします。しかし、コンパイラは、キャストできない(つまり、CatオブジェクトがAnimal型にキャストされている)という点は認識しせん。したがって、コンパイル時のエラーも、発生しません。スクリプト中に、正しくキャストできたかどうかのチェックを加えることで、ランタイム時のキャストのエラーを知ることができます[*4]。

import Dog;
function bark(myAnimal:Animal) {
   var foo:Dog = Dog(myAnimal);
   if (foo) {
     foo.bark();
   }
}


[訳者注*4] Flash Player 6でもキャストできたかどうかを確認するためには、instanceof演算子を使用するとよいでしょう。

import Dog;
function bark(myAnimal:Animal) {
   var foo:Dog = Dog(myAnimal);
   if (foo instanceof Dog) {
     foo.bark();
   }
}

式をインタフェースにキャストすることも可能です。その式がオブジェクトで、そのインタフェースを実装するか、インタフェースを実装するベースクラスをもつ場合に、キャストできます。それ以外の場合には、キャストできません。

インターフェイスに対する式をキャストできます。その式が、インターフェイスを実装するオブジェクトまた はインターフェイスを実装する基本クラスを持つオブジェクトである場合、キャストは正常に行われます。そ れ以外の場合、キャストは失敗します。

nullまたはundefinedにキャストすると、undefinedが返されます。

基本データ型(primitive data type)がグローバル変換関数をもち、それがキャスト演算子と同じ名前になるときは、その関数をオーバーライドすることはできません。なぜなら、グローバル変換関数は、キャスト演算子に優先するからです。たとえば、Arrayには、キャストすることができません。変換関数Array()は、キャスト演算子に優先するためです。データ変換関数について、詳しくは「ActionScriptリファレンスガイド」のArray()、Boolean()、Number()、Object()、String()の各変換関数の項をご参照ください。

出典
Flash MX 2004 ActionScript Dictionary: Casting Objectより邦訳。

_____
作成者: 野中文雄
作成日: 2005年4月24日


Copyright © 2001-2005 Fumio Nonaka.  All rights reserved.