0

この単純なAS3コードで何が起こっているのでしょうか。オブジェクトがTextFieldからより一般的なDisplayObjectに変更されるのはなぜですか?

public class Menu extends MovieClip
     {
      private var active_button:SimpleButton;

      public function Menu() 
      {
       active_button = SimpleButton( menu_list.getChildAt( 0 )); // ignore menu_list. it's just a collection of SimpleButtons
       trace( active_button.upState ); // [object TextField]
                // ** What's occuring here that makes active_button.upState no longer a TextField? **
       active_button.upState.textColor = 0x000000; // "1119: Access of possibly undefined property textColor through a reference with static type flash.display:DisplayObject." 

この質問はAS3に似ています。SimpleButtonタイプのグローバル変数が不明な理由でDisplayObjectに変更され、.upState.textColorにアクセスできなくなります。。これを投稿するのは、より焦点が絞られており、より広範な問題の1つの側面を扱っているためです。

4

1 に答える 1

2

コンパイル時と実行時の型の違いがわかります。このコードでは:

trace( active_button.upState ); // [object TextField]

オブジェクトをトレースに渡し、トレースは実行時に存在する実際のオブジェクト タイプを表示します。

ただし、この場合:

active_button.upState.textColor = 0x000000;

のオブジェクトを使用するコードを記述していますupState。upState は次のように定義されてDisplayObjectおり、すべてDisplayObjectにプロパティがないtextColorため、エラーが発生する必要があります。 には、 または のようなサブクラスでupStateあるすべてのものを実際に含めることができます。DisplayObjectDisplayObjectTextField

TextFieldキャストすることで、それが であることを確実に知っていることをコンパイラーに伝えることができます。

TextField(active_button.upState).textColor = 0x000000;

asキーワードを使用したキャストの別の形式があり、指定したとおりに型指定されたオブジェクトまたは を返しますnull。このキーワードを使用して、オブジェクトが特定のタイプであるかどうかをテストし、条件付きで (!= nullチェックを介して) 使用する必要があります。

var textField:TextField = active_button.upState as TextField;
if (textField != null) {
    textField.textColor = 0;
}
于 2010-01-29T21:10:52.353 に答える