Перечисляемый тип на 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. В этом случае передаваемй параметр все таки имеет существенное значение. |
Часовой пояс GMT +4, время: 17:39. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.