Switch / Case на экземпляре типа / класса? - PullRequest
1 голос
/ 06 мая 2011

У меня есть набор различных мувиклипов:

Pink
Yellow
Red

, и я создаю элемент

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

и т. Д.

Как написать переключателькейс, чтобы увидеть, какой MovieClip у меня есть?

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

 case Red:
 // do something
 break;
}

я знаю только, как записывать переключатели для строк ...

Ответы [ 4 ]

5 голосов
/ 06 мая 2011

Простой ответ: нет.

Pink и Red оба Color с, поэтому у Color есть функция:

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

и Pink и Red расширяют функцию:

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();

и это будет правильно для любого случая.

5 голосов
/ 06 мая 2011

Вы можете получить имя класса в виде строки и включить его, как обычно, используя этот метод ...

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()

3 голосов
/ 07 мая 2011

На этот вопрос уже есть ответ, но для всех, кто заинтересован, вы также можете сделать это:

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
2 голосов
/ 11 июня 2012

Используйте ключевое слово «is»:

if (item is Pink) // do something

Использование «is» в выражении case будет выглядеть так:

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» имеет гораздо лучшую производительность и не требует дополнительного кода.

...