2010-01-29 3 views
0

Que se passe-t-il dans ce simple code AS3? Pourquoi mon objet passe-t-il de TextField à DisplayObject plus générique?AS3: Pourquoi le type de données change-t-il automatiquement de 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." 

Cette question est simliar à AS3: global var of type SimpleButton changes to DisplayObject for unknown reason, won't let me access .upState.textColor!. Je poste ceci parce que c'est plus concentré et traite d'un seul aspect de la question plus large.

+0

Pour moi ces deux questions ressemblent à un doublon. Je ne suis pas sûr de la différence. –

Répondre

2

Vous voyez la différence entre le temps de compilation et le type d'exécution. Dans ce code:

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

vous passez l'objet à tracer et trace va montrer le type d'objet réel qui existe au moment de l'exécution.

Cependant, dans ce cas:

active_button.upState.textColor = 0x000000; 

Vous écrire du code qui utilise l'objet dans upState. upState est défini comme DisplayObject et tous les DisplayObject n'ont pas de propriété textColor, il doit donc vous donner une erreur. upState est autorisé à contenir réellement tout ce qui est un DisplayObject ou une sous-classe de DisplayObject comme TextField.

Vous pouvez dire au compilateur que vous êtes sûr qu'il s'agit d'un TextField en le moulant.

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

Il est une autre forme de coulée en utilisant le mot-clé as qui renverra l'objet, typé comme spécifié ou null. Vous souhaitez utiliser ce mot clé pour tester si un objet est un certain type et l'utiliser conditionnellement (via une vérification != null).

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