Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 类型/类实例上的开关/大小写?_Actionscript 3_Switch Statement - Fatal编程技术网

Actionscript 3 类型/类实例上的开关/大小写?

Actionscript 3 类型/类实例上的开关/大小写?,actionscript-3,switch-statement,Actionscript 3,Switch Statement,我有一套不同的电影: Pink Yellow Red 我创建了一个项目 item = new Pink(); item = new Red(); 等等 我如何写一个开关盒来看看我有哪部电影 switch (item) { case Pink: // do something break; case Red: // do something break; } 我只知道如何为字符串编写切换案例…您可以将类名作为字符串,并像通常使用此方法一样对其进行切换 switch (getQu

我有一套不同的电影:

Pink
Yellow
Red
我创建了一个项目

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

我如何写一个开关盒来看看我有哪部电影

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

 case Red:
 // do something
 break;
}

我只知道如何为字符串编写切换案例…

您可以将类名作为字符串,并像通常使用此方法一样对其进行切换

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

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

您可以将类名作为字符串获取,并像通常使用此方法一样对其进行切换

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

 case "Red":
 // do something
 break;
}
简单的回答:不要

Pink
Red
都是
Color
s,因此使
Color
具有以下功能:

interface IColor
{
  public function doSomething():void;
}
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
  }
}
并具有
粉红色
红色
扩展功能:

interface IColor
{
  public function doSomething():void;
}
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();
无论哪种情况,它都会做正确的事情。

简单的回答:不要

Pink
Red
都是
Color
s,因此使
Color
具有以下功能:

interface IColor
{
  public function doSomething():void;
}
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
  }
}
并具有
粉红色
红色
扩展功能:

interface IColor
{
  public function doSomething():void;
}
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();

无论哪种情况,它都会做正确的事情。

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

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

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

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

使用“is”关键字:

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”语句的强大之处在于它适用于继承的类型。例如,如果我想查看电影剪辑、精灵或SimpleButton,我可以写:

if (item is DisplayObject) // do something
因为所有这些类型都继承自DisplayObject


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

使用“is”关键字:

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”语句的强大之处在于它适用于继承的类型。例如,如果我想查看电影剪辑、精灵或SimpleButton,我可以写:

if (item is DisplayObject) // do something
因为所有这些类型都继承自DisplayObject


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

似乎是个好主意,但我只是在本例中切换MovieClips的可见性……我会在将来注意到这一点。有时我处理的是我无法控制的类,或者在一个逻辑块中混合使用对象、结构甚至方法(例如:
if(object.hasSomething()){}else if(method_call()){}else if($precomputed_昂贵_boolean_value){}
。在这种情况下,我不能只添加doSomething()在子类中重写它们。此外,有时这些类不负责处理我在
案例中尝试执行的任何操作。我讨厌
if
和switch(true)的堆栈,switch(true)更容易阅读和遵循。if
语句的
堆栈很好,但是
switch(true)语句
不是。这似乎是个好主意,但我只是在切换MovieClips的可见性,在这种情况下……我会在将来注意到这一点。有时我处理的类我无法控制,或者在一个逻辑块中混合使用对象、结构甚至方法(例如:
if(object.hasSomething()){}else if(method_call()){}else if(method_call()){else if($precomputed\u昂贵的\u boolean\u值){}
。在这种情况下,我不能只将doSomething()添加到父类中,然后在子类中重写它们。此外,有时这些类不负责处理我在
case
语句中尝试执行的任何操作。我讨厌
if
和switch(true)的堆栈更容易阅读和理解。
如果
语句可以,但是
switch(true)
不是。
switch(true)
语句很糟糕,永远不要使用它们。@zzzzBov你能详细说明一下吗?@lucek,
switch(true)
语句使用的字符比执行与
if..else if..else
块相同的功能所需的字符多,可读性不如
if..else if
块,这使得它们的可维护性较差。很容易意外忘记
break
子句,并最终导致隐式故障行为。我的建议:不要永远不要使用它们。
switch(true)
语句很糟糕,永远不要使用它们。@zzzzBov你能详细说明一下吗?@lucek,
switch(true)
语句使用的字符比执行与
if..else if..else
块相同的功能所需的字符多,可读性不如
if..else if
块,这使得它们的可维护性较差。很容易意外忘记
break
子句,并最终导致隐式故障行为。我的建议:不要我从不使用它们。