![]() |
Перечисляемый тип на AS3
Вечер добрый, господа соратники.
Давеча загадали мне загадку: необходимо написать на AS3 перечисляемый тип. Реализовать используя классы Enumeration, IntEnumeration, UintEnumeration, StringEnumeration, которые так же полагается реализовать самостоятельно. Ну и приведены примеры использования Код AS3:
Код AS3:
Я прочел некоторое количество статей по реализации этого паттерна, но в условия задачи он не уложился. А не уложился он потому, что при невозможности модифицировать класс, необходимо было реализовать метод etElementsList(enumerationClass:Class):Vector.<Enumeration> который должен был отдавать все значения перечисления. Насчет задачи вывода значений перечисления меня посетила только одна мысль: ведь любой класс, это на самом деле объект класса Class и по идее должна быть возможность просмотреть его свойства, ведь задавая статические константы мы задаем константы для объекта-класса. то есть например Код AS3:
Так же я не вижу возможности закрыть эти классы так, чтобы из-вне невозможно было бы создавать их экземпляры, поскольку статические инициализаторы не наследуются, равно как и вложенные классы. Вобщем у меня два вопроса, в связи с моим провалом: 1) Есть ли возможность при таких условиях добраться-таки до всех значений статических констант? 2) Есть ли возможность при таких условиях закрыть классы для создания экземпляров извне? |
Цитата:
Получить список полей можно при помощи методов: getDefinitionByName, describeType Только зачем вам этот список полей? Ведь в приведённом вами коде нет примеров где он нужен, а чтобы эти примеры компилировались достаточно просто написать: Код AS3:
Как тогда понять какой функционал надо запихнуть в UintEnumeration? Цитата:
|
Вот только если Вы хотите узнать о статических свойствах класса, то describeType не поможет, он их не видит.
|
describeType нормально видит статические константы
насчет закрыть классы для создания экземпляров извне при таких условиях - действительно непонятно о каких условиях речь, "Модифицировать приведенные в использовании классы запрещается" или что? |
@Akopalipsis, вы не правы, describeType работает и показывает статику если в качестве аргумента методу будет передан класс, если же необходимо работать с объектом, то можно сделать так:
Код AS3:
А еще можно вот тут почитать http://www.flasher.ru/forum/blog.php?b=131 |
Да, ошибся, я вот как пробовал -
Код AS3:
Код AS3:
|
Код AS3:
|
Ого, оперативно вы )
Насчет describeType большое спасибо, это очень помогло. Я уж было думал, что все это можно сделать если только каким-нибудь безумно грязным хаком, а тут оказывается есть готовая утилитка. Сегодня-завтра накидаю демку того, что хотелось бы получить в результате, чтобы исключить неоднозначности в вопросах, а то пост писал несколько второпях, уходя с работы. Больше так не буду ) |
интересная тема, спасибо всем
|
Итак, поехали.
Для начала приведу исходый текст задания, может быть я чего-то не допонял: Цитата:
Для чего такая длинная цепочка наследования классов(Enumeration, UintEnumeration, StringEnumeration), я так и не понял, поскольку условиями задачи запрещается даже вызывать конструктор суперкласса в UnitType и UnitUpgradeType. Из-за чего иерархия классов в моем представлении сложлась следующим, весьма нелепым, образом: класс Enumeration: Код AS3:
Код AS3:
Код AS3:
Кстати, попутно еще один вопрос: могу ли я в классах наследниках переписать так метод get value() чтобы он возвращал значения другого типа? Так как в данной ситуации, это могла быть единственная польза принесенная таким наследованием. Далее. Я так понял что методы getElementsList(enumerationClass:Class):Vector.<Enumeration> и getElementByValue(value:*, enumClass:Class):Enumeration это методы, напрмер, объекта Main. В этом случае передаваемй параметр все таки имеет существенное значение. |
Цитата:
Код AS3:
Цитата:
На практике такой стиль не подводил(без всяких базовых классов - они практически бесполезны и с забиванием большого гвоздя на проверки создания не в том месте - они не от чего не защищают): Код AS3:
|
Вчера не спрашивал, потому что думал, пойму. Но нет, я и статью прочёл и код смотрел сто раз.
Объясните на простом языке, для чего это. |
если честно, не совсем понял в чем проблема
вот такой вариант, например Код AS3:
|
expl, Я вот вобщем-то тоже придерживаюсь идеи о том, что адекватнее всего иметь список констант уже заранее сформированный. при том может быть, если уж имеем дело со списком то и хранить их например в хэше и запрашивать по ключу, нежели изголяться через describeType.
Akopalipsis, Для чего что именно? Реализация перечислений? Об этом я писал несколько выше: Цитата:
silin, Если честно, мне кажется, что проблема на деле в странно поставленной задаче. Сам запутался и вас запутал. В общем на деле пожалуй ваш вариант наиболее приближен к тому, что как я понял от меня хотели. Сформирую свой вариант и, если будет какой-то ответ по заданию, расскажу, что же там была за черная магия в описании. Вобщем всем спасибо, вы мне очень помогли ) |
Хочется полюбопытствовать, в конструкторах классов присутствует параметр id, так вот он для того, чтобы в каком-нибудь особом случаи сравнивать по нему? Типа -
Код AS3:
|
>>Правильно я понял?
все правильно, в особых случаях параметр id можно использовать для сравнения в операторе if |
Немного не по теме - а при помощи describeType можно только public свойства увидеть?
Почему-то мне кажется, что можно и к остальным обращаться-считать, но у меня не получается и мне уже кажется, что я что-то напутал. |
да, при помощи describeType можно только public свойства увидеть
|
silin Спасибо! Ужас.
|
если кому еще интересно то выглядеть должно так так
|
Цитата:
|
Цитата:
|
Код AS3:
|
Цитата:
Код AS3:
|
не, так не катит. исправляйся )
И еще я стринги во флеше не люблю. Лучше так Код AS3:
|
да, я согласен полностью. но хочу заметить это не как не влияет и используется только при отладке
|
А что будет, если где-нибудь я сделаю так:
Код AS3:
Код AS3:
и вот здесь вот: Код AS3:
Код AS3:
В целом идея отличная, очень нужная :) Спасибо автору за тему! Нужно только немного улучшить: - не давать напрямую создавать экземпляры UnitType (все возможные значения должны быть объявлены только статически) - сделать IntEnumeration, UintEnumeration, StringEnumeration абстрактными - в Enumeration проверку на абстракцию вынести перед проверкой наличия в словаре списка экземпляров класса |
| Часовой пояс GMT +4, время: 12:23. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.