2010-01-29 35 views
0

这个简单的AS3代码发生了什么?为什么我的对象从TextField更改为更通用的DisplayObject?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: global var of type SimpleButton changes to DisplayObject for unknown reason, won't let me access .upState.textColor!。我发布这篇文章是因为它更专注于处理更广泛问题的单一方面。

+0

对我来说,这两个问题看起来像重复。我不确定有什么不同。 – 2010-01-29 21:14:09

回答

2

您将看到编译时和运行时类型之间的区别。在此代码:

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

你传递的对象追踪和跟踪是要表明,存在于运行时的实际对象类型。

然而,在这种情况下:

active_button.upState.textColor = 0x000000; 

你编写使用对象upState代码。 upState被定义为DisplayObject并且所有DisplayObject都没有textColor属性,所以它必须给你一个错误。允许upState实际上包含任何DisplayObjectDisplayObject的子类,如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; 
} 
相关问题