AS3: Почему тип данных автоматически изменяется с TextField на DisplayObject сам по себе? - PullRequest
0 голосов
/ 29 января 2010

Что происходит с этим простым фрагментом кода 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 Ответ

2 голосов
/ 30 января 2010

Вы видите разницу между временем компиляции и типом времени выполнения. В этом коде:

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

Вы передаете объект для трассировки, и трассировка покажет фактический тип объекта, который существует во время выполнения.

Однако в этом случае:

active_button.upState.textColor = 0x000000;

Вы пишете код, который использует объект в upState. upState определяется как DisplayObject, и все DisplayObject не имеют свойства textColor, поэтому оно должно выдать ошибку. upState разрешено фактически содержать все, что является DisplayObject или подклассом DisplayObject, как TextField.

Вы можете сказать компилятору, что точно знаете, что это TextField, приведя его.

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

Существует еще одна форма приведения с использованием ключевого слова as, которое будет возвращать объект, указанный как указано, или null. Вы хотите использовать это ключевое слово, чтобы проверить, является ли объект определенного типа, а затем использовать его условно (через проверку != null).

var textField:TextField = active_button.upState as TextField;
if (textField != null) {
    textField.textColor = 0;
}
...