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
子句,并最终导致隐式故障行为。我的建议:不要我从不使用它们。