Macromedia Flash非公式テクニカルノート オブジェクトのキャスト
Platform: All ActionScript 2.0では、あるデータ型を他のデータ型にキャストすることができます。Flashが用いるキャスト演算子は、関数呼出しのかたちを取ります。これは、ECMAScript第4版提案に規定された「明示的な型変換」(explicit coercion)[*1]に合致します。キャストを行うことにより、オブジェクトが指定された型であることを宣言できます。すると、型チェックが行われるとき、コンパイラはオブジェクトの本来の型には存在しないプロパティ一式が備わっているものとして、そのオブジェクトを扱います。これはたとえば、オブジェクトの配列をループ処理するとき、個々のオブジェクトの型は異なっても、基本となる型を共有するという場合に便利です。
キャストのシンタックスは、type (item)です。すると、itemのデータ型がtypeであるものとして、コンパイラに処理させることができます。キャストは、実質的に関数呼出しです。ランタイム時にキャストできなかった場合には、呼出された関数はnullを返します(Flash Player 7以降でパブリッシュされたファイルの場合。Flash Player 6でパブリッシュされたファイルでは、キャストできなかったときのランタイムのサポートはありません[*2])。キャストが正しく行われると、呼出された関数は元のオブジェクトを返します。しかし、コンパイラがランタイム時にキャストできるかどうかを判定できず、コンパイル時のエラーを発生しない場合があります。以下のコードは、その例を示します[*3]。
この中で、コンパイラに対して、fooがDogオブジェクトだと宣言しました。そのため、コンパイラは、foo.bark();(訳者注: 原文に「temp.bark();」とあるのは誤りか、そうでなくても誤解を招きやすい記述でしょう)がステートメントとして問題ないものとみなします。しかし、コンパイラは、キャストできない(つまり、CatオブジェクトがAnimal型にキャストされている)という点は認識しせん。したがって、コンパイル時のエラーも、発生しません。スクリプト中に、正しくキャストできたかどうかのチェックを加えることで、ランタイム時のキャストのエラーを知ることができます[*4]。
式をインタフェースにキャストすることも可能です。その式がオブジェクトで、そのインタフェースを実装するか、インタフェースを実装するベースクラスをもつ場合に、キャストできます。それ以外の場合には、キャストできません。 インターフェイスに対する式をキャストできます。その式が、インターフェイスを実装するオブジェクトまた はインターフェイスを実装する基本クラスを持つオブジェクトである場合、キャストは正常に行われます。そ れ以外の場合、キャストは失敗します。 nullまたはundefinedにキャストすると、undefinedが返されます。 基本データ型(primitive data type)がグローバル変換関数をもち、それがキャスト演算子と同じ名前になるときは、その関数をオーバーライドすることはできません。なぜなら、グローバル変換関数は、キャスト演算子に優先するからです。たとえば、Arrayには、キャストすることができません。変換関数Array()は、キャスト演算子に優先するためです。データ変換関数について、詳しくは「ActionScriptリファレンスガイド」のArray()、Boolean()、Number()、Object()、String()の各変換関数の項をご参照ください。 出典 _____ Copyright © 2001-2005 Fumio Nonaka. All rights reserved. |
|||||||||||