|
|
|||||
Регистрация: May 2011
Сообщений: 221
|
Перечисляемый тип на AS3
Вечер добрый, господа соратники.
Давеча загадали мне загадку: необходимо написать на AS3 перечисляемый тип. Реализовать используя классы Enumeration, IntEnumeration, UintEnumeration, StringEnumeration, которые так же полагается реализовать самостоятельно. Ну и приведены примеры использования public class UnitType extends UintEnumeration { 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 function UnitType(val:uint) { value = val; } } public class UnitUpgradeType extends StringEnumeration { public static const U1:UnitUpgradeType = new UnitUpgradeType("U1"); public static const U2:UnitUpgradeType = new UnitUpgradeType("U2"); public static const U3:UnitUpgradeType = new UnitUpgradeType("U3"); public static const U3:UnitUpgradeType = new UnitUpgradeType("U4"); public function UnitUpgradeType(val:String) { value = val; } } Я прочел некоторое количество статей по реализации этого паттерна, но в условия задачи он не уложился. А не уложился он потому, что при невозможности модифицировать класс, необходимо было реализовать метод etElementsList(enumerationClass:Class):Vector.<Enumeration> который должен был отдавать все значения перечисления. Насчет задачи вывода значений перечисления меня посетила только одна мысль: ведь любой класс, это на самом деле объект класса Class и по идее должна быть возможность просмотреть его свойства, ведь задавая статические константы мы задаем константы для объекта-класса. то есть например но, как вы все уже догадались, эта идея с треском провалилась. Так же я не вижу возможности закрыть эти классы так, чтобы из-вне невозможно было бы создавать их экземпляры, поскольку статические инициализаторы не наследуются, равно как и вложенные классы. Вобщем у меня два вопроса, в связи с моим провалом: 1) Есть ли возможность при таких условиях добраться-таки до всех значений статических констант? 2) Есть ли возможность при таких условиях закрыть классы для создания экземпляров извне? |
|
|||||
Цитата:
Получить список полей можно при помощи методов: getDefinitionByName, describeType Только зачем вам этот список полей? Ведь в приведённом вами коде нет примеров где он нужен, а чтобы эти примеры компилировались достаточно просто написать: public class UintEnumeration { public uint value; } public class StringEnumeration { public string value; } Как тогда понять какой функционал надо запихнуть в UintEnumeration? Цитата:
|
|
|||||
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
Вот только если Вы хотите узнать о статических свойствах класса, то describeType не поможет, он их не видит.
|
|
|||||
describeType нормально видит статические константы
насчет закрыть классы для создания экземпляров извне при таких условиях - действительно непонятно о каких условиях речь, "Модифицировать приведенные в использовании классы запрещается" или что? |
|
|||||
@Akopalipsis, вы не правы, describeType работает и показывает статику если в качестве аргумента методу будет передан класс, если же необходимо работать с объектом, то можно сделать так:
Добавлено через 7 минут А еще можно вот тут почитать http://www.flasher.ru/forum/blog.php?b=131
__________________
местонахождение |
|
|||||
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
Да, ошибся, я вот как пробовал -
package { public class StorageClass { public static const STATIC_PROP:TestClass = new TestClass(); } } |
|
|||||
.
|
public class Enumeration { public function Enumeration(id:*) { this.id = id; } public var id:*; public function etElementsList(/*enumerationClass:Class этот параметр, к.м.к., не имеет смысла */):Vector.<Enumeration> { return null; } public function toString():String { return this.id.toString(); } } public class UintEnumeration extends Enumeration { public function UintEnumeration(id:uint) { super(id); } } public class UnitType extends UintEnumeration { 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); private static const _elementsList:Vector.<Enumeration> = new <Enumeration>[HERO, WARRIOR, MAGE, ENEMY]; public function UnitType(id:uint) { super(id); } public override function etElementsList(/*enumerationClass:Class*/):Vector.<Enumeration> { return _elementsList.slice(); } } |
|
|||||
Регистрация: May 2011
Сообщений: 221
|
Ого, оперативно вы )
Насчет describeType большое спасибо, это очень помогло. Я уж было думал, что все это можно сделать если только каким-нибудь безумно грязным хаком, а тут оказывается есть готовая утилитка. Сегодня-завтра накидаю демку того, что хотелось бы получить в результате, чтобы исключить неоднозначности в вопросах, а то пост писал несколько второпях, уходя с работы. Больше так не буду ) |
|
|||||
интересная тема, спасибо всем
|
|
|||||
Регистрация: May 2011
Сообщений: 221
|
Итак, поехали.
Для начала приведу исходый текст задания, может быть я чего-то не допонял: Цитата:
Для чего такая длинная цепочка наследования классов(Enumeration, UintEnumeration, StringEnumeration), я так и не понял, поскольку условиями задачи запрещается даже вызывать конструктор суперкласса в UnitType и UnitUpgradeType. Из-за чего иерархия классов в моем представлении сложлась следующим, весьма нелепым, образом: класс Enumeration: public class Enumeration { protected var _value:*; public function Enumeration() { } public function get value():* { return _value; } } Класс StringEnumeration public class StringEnumeration extends Enumeration { public function StringEnumeration() { } } Кстати, попутно еще один вопрос: могу ли я в классах наследниках переписать так метод get value() чтобы он возвращал значения другого типа? Так как в данной ситуации, это могла быть единственная польза принесенная таким наследованием. Далее. Я так понял что методы getElementsList(enumerationClass:Class):Vector.<Enumeration> и getElementByValue(value:*, enumClass:Class):Enumeration это методы, напрмер, объекта Main. В этом случае передаваемй параметр все таки имеет существенное значение. |
Часовой пояс GMT +4, время: 11:02. |
|
« Предыдущая тема | Следующая тема » |
Теги |
AS3 , enum , static |
|
|