As3.0 类的枚举
“枚举”是您创建的一些自定义数据类型,用于封装一小组值。ActionScript 3.0 并不支持具体的枚举工具,这与 C++ 使用 enum 关键字或 Java 使用 Enumeration 接口不一样。不过,您可以使用类或静态常量创建枚举。例如,ActionScript 3.0 中的 PrintJob 类使用名为 PrintJobOrientation 的枚举来存储由 "landscape" 和 "portrait" 组成的一组值,如下面的代码所示:
public final class PrintJobOrientation { public static const LANDSCAPE:String = "landscape"; public static const PORTRAIT:String = "portrait"; }
按照惯例,枚举类是使用 final 属性声明的,因为不需要扩展该类。该类仅由静态成员组成,这表示不创建该类的实例。而是直接通过类对象来访问枚举值,如以下代码摘录中所示:
var pj:PrintJob = new PrintJob(); if(pj.start()) { if (pj.orientation == PrintJobOrientation.PORTRAIT) { ... } ... }
ActionScript 3.0 中的所有枚举类都只包含 String、int 或 uint 类型的变量。使用枚举而不使用文本字符串或数字值的好处是,使用枚举更易于发现字面错误。如果枚举名输入错误,ActionScript 编译器会生成一个错误。如果使用字面值,存在拼写错误或使用了错误数字时,编译器并不会报错。在上一个示例中,如果枚举常量的名称不正确,编译器会生成错误,如以下代码摘录中所示:
if (pj.orientation == PrintJobOrientation.PORTRAI) // compiler error
但是,如果拼错了字符串字面值,编译器并不生成错误,如下所示:
if (pj.orientation == "portrai") // no compiler error
创建枚举的第二种方法还包括使用枚举的静态属性创建单独的类。这种方法的不同之处在于每一个静态属性都包含一个类实例,而不是字符串或整数值。例如,以下代码为一星期中的各天创建了一个枚举类:
public final class Day { public static const MONDAY:Day = new Day(); public static const TUESDAY:Day = new Day(); public static const WEDNESDAY:Day = new Day(); public static const THURSDAY:Day = new Day(); public static const FRIDAY:Day = new Day(); public static const SATURDAY:Day = new Day(); public static const SUNDAY:Day = new Day(); }
ActionScript 3.0 并不使用这种方法,但是许多开发人员都使用,他们更喜欢使用这种方法提供的改进类型检查功能。例如,返回枚举值的方法可将返回值限定为枚举数据类型。以下代码不但显示了返回星期中各天的函数,还显示了将枚举类型用作类型注释的函数调用:
function getDay():Day { var date:Date = new Date(); var retDay:Day; switch (date.day) { case 0: retDay = Day.MONDAY; break; case 1: retDay = Day.TUESDAY; break; case 2: retDay = Day.WEDNESDAY; break; case 3: retDay = Day.THURSDAY; break; case 4: retDay = Day.FRIDAY; break; case 5: retDay = Day.SATURDAY; break; case 6: retDay = Day.SUNDAY; break; } return retDay; } var dayOfWeek:Day = getDay();
您还可以增强 Day 类的功能,以使其将一个整数与星期中的各天关联,并提供一个 toString() 方法来返回各天的字符串表示形式。您可能希望实践一下,采用这种方法来增强 Day 类的功能。
-------------------------------------------------------------------------------------------------------------
例:
package
{
/**
* 颜色静态数据类
*
*/
public class ColorEnum
{
public static const _FFF3BC:ColorEnum = new ColorEnum(0xFFF3BC,"#FFF3BC","橙红色");
public static const _00FF00:ColorEnum = new ColorEnum(0x00FF00,"#00FF00","绿色");
public static const _FF0000:ColorEnum = new ColorEnum(0xFF0000,"#FF0000","红色");
public static const _FFFFFF:ColorEnum = new ColorEnum(0xFFFFFF,"#FFFFFF","白色");
public static const _00FFFF:ColorEnum = new ColorEnum(0x00FFFF,"#00FFFF","青色");
public static const _000000:ColorEnum = new ColorEnum(0x000000,"#000000","黑色");
public static const _663300:ColorEnum = new ColorEnum(0x663300,"#663300","棕色");
public static const _0000FF:ColorEnum = new ColorEnum(0x0000FF,"#0000FF","蓝色");
public static const _422200:ColorEnum = new ColorEnum(0x422200,"#422200","深棕色");
public static const _0066CC:ColorEnum = new ColorEnum(0x0066CC,"#0066CC","淡蓝色");
public static const _339900:ColorEnum = new ColorEnum(0x339900,"#339900","草绿色");
public static var ENUM_TYPE:Object = {ENGLISH:"english",CHINESE:"chinese",GERMAN:"german"}
public var original:Number;
public var name:String;
public var description:String;
public function ColorEnum(original:Number,name:String,description:String):void
{
this.original = original;
this.name = name;
this.description = description;
}
}
}
-------------------------------------------------------------------------------------------------------------
引用:
trace(ColorEnum._FFF3BC.original,ColorEnum._FFF3BC.name,ColorEnum._FFF3BC.description);