类型/类实例上的开关/案例?

时间:2011-05-06 18:48:06

标签: actionscript-3 switch-statement

我有一组不同的MovieClip:

Pink
Yellow
Red

我创建了一个项目

item = new Pink();
item = new Red();

等...

如何编写一个开关盒以查看我有哪个MovieClip?

switch (item) {
 case Pink:
 // do something
 break;

 case Red:
 // do something
 break;
}

我只知道如何为字符串编写开关案例......

4 个答案:

答案 0 :(得分:5)

您可以将类名称作为字符串获取并按照通常使用此方法的方式进行切换...

switch (getQualifiedClassName(item)) {
 case "Pink":
 // do something
 break;

 case "Red":
 // do something
 break;
}

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/utils/package.html#getQualifiedClassName()

答案 1 :(得分:5)

简单回答:不要。

PinkRed都是Color s,因此make Color具有以下功能:

interface IColor
{
  public function doSomething():void;
}

并让PinkRed扩展功能:

class Pink extends MovieClip implements IColor
{
  ...
  public override function doSomething():void
  {
    //different code
  }
}

class Red extends MovieClip implements IColor
{
  ...
  public override function doSomething():void
  {
    //more different code
  }
}

然后在你的代码中你可以打电话:

item.doSomething();

对任何一种情况都会做正确的事情。

答案 2 :(得分:3)

这个问题已经有了答案,但对于任何有兴趣的人,你也可以这样做:

package 
{
    import flash.display.Sprite;
    import flash.events.Event;

    public class Main extends Sprite 
    {
        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);

        }// end function

        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);

            var cat:Cat = new Cat();

            switch(Class(Object(cat).constructor))
            {
                case Cat : trace("instance of " + Cat); break;
                case Dog : trace("instance of " + Dog); break;

            }// end switch

            // output: 

        }// end function

    }// end class

}// end package

internal class Cat
{ 
    public function Cat() { }

}// end class

internal class Dog
{ 
    public function Dog() { }

}// end class

答案 3 :(得分:2)

使用“是”关键字:

if (item is Pink) // do something

在case语句中使用“is”将如下所示:

switch(true)
{
    case item is Pink :
        // do something
        break;

    case item is Red :
        // do something
        break;
}

关于“is”语句的强大功能是适用于继承类型。所以,例如,如果我想检查MovieClip,Sprite或SimpleButton,我可以写:

if (item is DisplayObject) // do something

因为所有这些类型都继承自DisplayObject。

另一个好处是没有不必要的内省(例如使用getQualifiedClassName)。因此,“is”关键字具有更好的性能,不需要额外的代码。