Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Перечисляемый тип на AS3 (http://www.flasher.ru/forum/showthread.php?t=206336)

expl 29.01.2014 14:21

Цитата:

То есть по факту, классы наследники мне пришлось оставить пустыми, потому как больше ничего поделать я с ними не могу.
Может они хотят что-то типа такого (хотя не факт):

Код AS3:

public class Enumeration
    {
        public function Enumeration()
        {
 
        }
 
        private var _commonValue:*;
        public function get commonValue():*// Это для обобщенных алгоритмов над всеми перечислениями
        {
            return _commonValue;
        }
 
    }
 
 public class UintEnumeration extends Enumeration
    {
 
        public function UintEnumeration()
        {
 
        }
 
        private var _value:uint;
        public function set value(value:uint):uint
        {
            _value = value;
            _commonValue = value;
        }
        public function get value():uint
        {
            return _value;
        }
    }

Цитата:

могу ли я в классах наследниках переписать так метод get value() чтобы он возвращал значения другого типа? Так как в данной ситуации, это могла быть единственная польза принесенная таким наследованием.
Пользу тут вообще искать сложно, они это, видимо, чисто ради примера сделали
На практике такой стиль не подводил(без всяких базовых классов - они практически бесполезны и с забиванием большого гвоздя на проверки создания не в том месте - они не от чего не защищают):
Код AS3:

public class UnitType
{
    // Список всех значений (не всегда нужен, кстати)
    public static const allUnits:Vector.<Unit> = new Vector.<Unit>();
 
    public static const Unit1:UnitType = new UnitType(1);
    public static const Unit1:UnitType = new UnitType(2);
    public static const Unit1:UnitType = new UnitType(3);
 
    private var _code:uint;
    public function get code():uint
    {
        return _code;
    }
 
    public function UnitType(code:uint)
    {
        _code = code;
        allUnits.Add(this);// заполнение списка
    }
}

А громоздить сюда рефлексию - это лишние проблемы при дебаге и никакой пользы

Akopalipsis 29.01.2014 14:47

Вчера не спрашивал, потому что думал, пойму. Но нет, я и статью прочёл и код смотрел сто раз.
Объясните на простом языке, для чего это.

silin 29.01.2014 15:13

если честно, не совсем понял в чем проблема
вот такой вариант, например
Код AS3:

package
{
        import flash.display.Sprite;
 
        public class Main extends Sprite
        {
 
                public function Main():void
                {
 
                        var list:Vector.<Enumeration> = Enumeration.getElementsList(UnitType);
                        trace("list : " + list);
                        var element:Enumeration = Enumeration.getElementByValue(1, UnitType);
                        trace("element : " + element);
                        var isHero:Boolean = (element === UnitType.HERO);
                        trace("isHero : " + isHero);
                }
 
        }
 
}
 
//=================================//
import flash.utils.describeType;
 
class Enumeration
{
        public var value:*;
 
        public function Enumeration(value:*)
        {
                this.value = value;
        }
 
        public static function getElementsList(enumClass:Class):Vector.<Enumeration>
        {
                var list:Vector.<Enumeration> = new Vector.<Enumeration>();
                var constList:XMLList = describeType(enumClass).constant;
 
                for each (var item:XML in constList)
                {
                        list.push(enumClass[item.@name])
                }
 
                return list;
 
        }
 
        public static function getElementByValue(value:*, enumClass:Class):Enumeration
        {
                var constList:XMLList = describeType(enumClass).constant;
 
                for each (var item:XML in constList)
                {
                        if (enumClass[item.@name].value == value)
                                return enumClass[item.@name];
                }
 
                return null;
        }
}
 
//=================================//
class UintEnumeration extends Enumeration
{
 
        public function UintEnumeration(value:uint)
        {
                super(value);
 
        }
 
}
 
//=================================//
class UnitType extends UintEnumeration
{
 
        public static const HERO:UnitType = new UnitType(1);
        public static const WARRIOR:UnitType = new UnitType(2);
 
        public function UnitType(value:uint)
        {
                super(value);
 
        }
 
}


Фенёк 29.01.2014 15:56

expl, Я вот вобщем-то тоже придерживаюсь идеи о том, что адекватнее всего иметь список констант уже заранее сформированный. при том может быть, если уж имеем дело со списком то и хранить их например в хэше и запрашивать по ключу, нежели изголяться через describeType.

Akopalipsis, Для чего что именно? Реализация перечислений? Об этом я писал несколько выше:
Цитата:

делаем код более читаемым, избавляясь от магических чисел, плюс ко всему мы имеем возможность иметь дело с этими значениями как с типом, что позволяет внести дополнительную конкретизацию при, например, описании методов.
Если вопрос в том зачем такая реализация, то тут уже я сильно затрудняюсь вам как-то это прокомментировать. Люди составлявшие задание по всей видимости пытались сделать сделать из него загадку, мол «вот вам странные условия задачи, попробуйте используя их дать нам ответ, какой мы хотим увидеть. Попытайтесь использовать нашу логику». Признаться честно глядя на все это мне кажется что такой способ можно охарактеризовать только одним словом - ИЗВРАТ.

silin, Если честно, мне кажется, что проблема на деле в странно поставленной задаче. Сам запутался и вас запутал. В общем на деле пожалуй ваш вариант наиболее приближен к тому, что как я понял от меня хотели. Сформирую свой вариант и, если будет какой-то ответ по заданию, расскажу, что же там была за черная магия в описании.

Вобщем всем спасибо, вы мне очень помогли )

Akopalipsis 15.02.2014 15:51

Хочется полюбопытствовать, в конструкторах классов присутствует параметр id, так вот он для того, чтобы в каком-нибудь особом случаи сравнивать по нему? Типа -
Код AS3:

...
public static const HERO:UnitType = new UnitType(1);
...
public static const HERO:uint = 0x000000;
...
if(HERO.id == HERO){...}

Правильно я понял?

silin 15.02.2014 16:42

>>Правильно я понял?
все правильно, в особых случаях параметр id можно использовать для сравнения в операторе if

Akopalipsis 16.02.2014 07:25

Немного не по теме - а при помощи describeType можно только public свойства увидеть?
Почему-то мне кажется, что можно и к остальным обращаться-считать, но у меня не получается и мне уже кажется, что я что-то напутал.

silin 16.02.2014 12:03

да, при помощи describeType можно только public свойства увидеть

Akopalipsis 16.02.2014 13:58

silin Спасибо! Ужас.

taluks 20.09.2016 01:54

если кому еще интересно то выглядеть должно так так


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

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