Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Магия Enumiration (перечисления) (http://www.flasher.ru/forum/showthread.php?t=208156)

inozemcev 09.06.2014 13:50

Магия Enumiration (перечисления)
 
собственно, есть такой код

Код AS3:

package
{
        /**
        * Пример реализации паттерна TypeSave Enumeration на языке ActionScript 3.
        *
        * @author  Aleh Krutsikau
        * @version 0.1
        */

        public class Season
        {
                // Ссылка на единственный экземпляр класса.
                public static const WINTER : Season = new Season("winter");
                public static const SPRING : Season = new Season("spring");
                public static const SUMMER : Season = new Season("summer");
                public static const AUTUMN : Season = new Season("autumn");
 
                private static var _enumCreated:Boolean = false;
                // magic happens here, the static code block
                {
                        _enumCreated = true;
                }
 
                private var _seasonName : String;
 
                /**
                * Конструктор.
                */

                public function Season(seasonName : String)
                {
                        if (_enumCreated)
                                throw new Error("The enum is already created.");
                        _seasonName = seasonName;
                }
 
                public function get seasonName() : String {
                        return _seasonName;
                }
        }
}

не могу понять как работает магия. А именно в каком случае работает код спрятанный в фигурных скобках в теле класса
Код AS3:

public class Season
{
{
_enumCreated = true;
}
}


dimarik 09.06.2014 14:24

Можно убрать фигурные скобки. Исполнение кода происходит последовательно "сверху вниз".

MikroAcse 09.06.2014 18:10

Этот код выполнится перед первым вызовом метода класса, в том числе и конструктора.

silin 09.06.2014 21:26

"сверху вниз", но после инициализации всех статических свойств, видимо, это и подразумевается под магией
Код AS3:

package
{
 
        public class Season
        {
                _enumCreated = (trace("assign (true)") == null);// выполнится самым поледним
 
                private static var _enumCreated:Boolean(trace("init (false)") != null);
 
                public static const WINTER : Season = new Season("winter");
                public static const SPRING : Season = new Season("spring");
                public static const SUMMER : Season = new Season("summer");
                public static const AUTUMN : Season = new Season("autumn");
 
                private var _seasonName : String;
 
 
                public function Season(seasonName : String)
                {
                        if (_enumCreated)
                                throw new Error("The enum is already created.");
                        _seasonName = seasonName;
                        trace( seasonName + " created");
                }
 
                public function get seasonName() : String {
                        return _seasonName;
                }
        }
}


dimarik 10.06.2014 10:31

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

Код AS3:

package {
    Season;
}

Код AS3:

package {
    class SecondSeason {
        Season;
    }
}


ChuwY 10.06.2014 11:29

Это в Air SDK, если мне не изменяет память.
А во flex SDK при создании первого экземпляра или при первом вызове статического метода.
Из-за этой особенности при переезде с компилятора на компилятор поломал голову.

dimarik 11.06.2014 10:47

Ага, проверил. Во Flex можно воспользоваться конструкцией кастинга или конвертации.
Class(Season) или Season as Class. Либо в общем случае Object(Season) или Season as Object.

Код AS3:

package {
    Class(Season);
}

Код AS3:

package {
    class SecondSeason {
        Season as Class;
    }
}



Часовой пояс GMT +4, время: 23:18.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.