Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Список констант класса (http://www.flasher.ru/forum/showthread.php?t=208157)

inozemcev 09.06.2014 16:07

Список констант класса
 
Необходимо получить список констант класса, чтобы написать корректное наследование от Enumiration

Одним из ключевых свойств паттерна Enumiration является обязательное условие создания экземпляров перечисления исключительно через константы.

Собственно на данный момент у меня это осуществляется методом Evaluation.created (); Любые попытки вызвать конструктор после этого будут выкидывать ошибки

Код AS3:

public class UnitType extends UintEnumiration 
        {
 
                public static const HERO:UnitType =                new UnitType(1);
                public static const WARRIOR:UnitType =                new UnitType(2);
                public static const MAGE:UnitType =                new UnitType(3);
                public static const ENEMY:UnitType =                new UnitType(4);
 
                Enumiration.creaded (true);
 
 
                public function UnitType(value:uint)
                {
                        super (value);
                }
 
        }

Хочется поднять это на более верхний уровень и избежать вызова метода Enumiration.creaded (true); Но не совсем понятно как это можно сделать. Есть вариант сравнивать количество экземпляров класса с количеством констант класса, но я не знаю как получить список констант класса.

ZackMercury 09.06.2014 16:10

Можно получить число и список экземпляров, а не список констант.
Код AS3:

public class UnitType extends UintEnumiration 
{
 
        public static const HERO:UnitType =                new UnitType(1);
        public static const WARRIOR:UnitType =                new UnitType(2);
        public static const MAGE:UnitType =                new UnitType(3);
        public static const ENEMY:UnitType =                new UnitType(4);
 
        public static var numOfObjects:int = 0;
        public static var objects:Vector.<UnitType> = new Vector.<UnitType>();
 
        Enumiration.creaded (true);
 
 
        public function UnitType(value:uint)
        {
                super (value);
                numOfObjects ++;
                objects.push(this);
        }
 
}


inozemcev 09.06.2014 16:28

да, все верно. Я могу получить список экземпляров, но мне также нужен список констант иначе я не могу уточнить создан ли был экземпляр для того чтобы его сделали значением константы класса, либо просто кто-то и где-то в коде вызвал конструктор. Собственно, Enumiration.created () блокирует дальнейшие вызовы конструктора. Только список экземпляров ничего не даст.

ZackMercury 09.06.2014 16:36

Код AS3:

public static function isValidValue(type:String):Boolean 
{
    var m_constNameList:XMLList = describeType(Layers).descendants("constant");
 
    for each(var obj:Object in m_constNameList)
    {
        if (type == Layers[obj.@name])
        {
            return true;
        }
    }
    return false;
}

Нашёл в гугле такой вот код. Он должен проверять класс Layers на наличие константы с передаваемым в метод именем типа String. Сам не тестил, но, надеюсь, он работает.

Судя из кода, количество констант можно с помощью вызова метода XMLList.length()

inozemcev 09.06.2014 17:01

Спасибо большое. Для того чтобы приблизиться к вызову метода describeType, стал вытаскивать ссылку на класс наследник и неожиданно выяснил что при создании экземпляра в качестве значения его константы он не успевает определить наименование класса:

Код AS3:

var className:String = getQualifiedClassName (this);
var enumClass:Object = getDefinitionByName (className);
// если экземпляр создан не через константу
if (enumClass != null) {
        //throw new Error(value);
}

В итоге получил нужную проверку


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

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