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!. 我发布这个是因为它更专注并且处理更广泛问题的一个方面。

4

1 回答 1

2

您会看到编译时和运行时类型之间的区别。在这段代码中:

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

您将对象传递给跟踪,跟踪将显示运行时存在的实际对象类型。

但是,在这种情况下:

active_button.upState.textColor = 0x000000;

您正在编写使用upState. upState 被定义为DisplayObject并且都DisplayObject没有textColor属性,所以它必须给你一个错误。 upState允许实际包含任何是 aDisplayObject或类似 a 的子类的DisplayObject东西TextField

您可以通过强制转换来告诉编译器您确定它是 a 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 回答