Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 28.01.2014, 19:48
Фенёк вне форума Посмотреть профиль Отправить личное сообщение для Фенёк Найти все сообщения от Фенёк
  № 1  
Ответить с цитированием
Фенёк

Регистрация: May 2011
Сообщений: 221
Question Перечисляемый тип на AS3

Вечер добрый, господа соратники.

Давеча загадали мне загадку: необходимо написать на AS3 перечисляемый тип. Реализовать используя классы Enumeration, IntEnumeration, UintEnumeration, StringEnumeration, которые так же полагается реализовать самостоятельно. Ну и приведены примеры использования

Код AS3:
	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;
		}
	}
Код AS3:
	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 и по идее должна быть возможность просмотреть его свойства, ведь задавая статические константы мы задаем константы для объекта-класса.

то есть например
Код AS3:
                for (var property:String in SomeClass)
                {
                    trace(property)
                }
но, как вы все уже догадались, эта идея с треском провалилась.

Так же я не вижу возможности закрыть эти классы так, чтобы из-вне невозможно было бы создавать их экземпляры, поскольку статические инициализаторы не наследуются, равно как и вложенные классы.

Вобщем у меня два вопроса, в связи с моим провалом:

1) Есть ли возможность при таких условиях добраться-таки до всех значений статических констант?
2) Есть ли возможность при таких условиях закрыть классы для создания экземпляров извне?

Старый 28.01.2014, 20:34
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 2  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
1) Есть ли возможность при таких условиях добраться-таки до всех значений статических констант?
Узнать тип объекта: getQualifiedClassName(this) (http://www.flasher.ru/forum/showthread.php?t=132772;
Получить список полей можно при помощи методов: getDefinitionByName, describeType

Только зачем вам этот список полей? Ведь в приведённом вами коде нет примеров где он нужен,
а чтобы эти примеры компилировались достаточно просто написать:

Код AS3:
public class UintEnumeration
{
    public uint value;
}
 
public class StringEnumeration
{
    public string value;
}
Т.е. чего-то не договариваете вы - примеров использования UnitType нет.
Как тогда понять какой функционал надо запихнуть в UintEnumeration?

Цитата:
2) Есть ли возможность при таких условиях закрыть классы для создания экземпляров извне?
Отличить создание и присвоение статическому полю от всех остальных созданий? Только каким-нибудь злым колдунством.

Старый 28.01.2014, 21:00
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 3  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
Вот только если Вы хотите узнать о статических свойствах класса, то describeType не поможет, он их не видит.

Старый 28.01.2014, 21:27
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 4  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
describeType нормально видит статические константы
насчет закрыть классы для создания экземпляров извне при таких условиях - действительно непонятно о каких условиях речь, "Модифицировать приведенные в использовании классы запрещается" или что?

Старый 28.01.2014, 21:29
СлаваRa вне форума Посмотреть профиль Отправить личное сообщение для СлаваRa Найти все сообщения от СлаваRa
  № 5  
Ответить с цитированием
СлаваRa
 
Аватар для СлаваRa

блогер
Регистрация: Feb 2008
Адрес: http://playtika.com
Сообщений: 1,119
Записей в блоге: 5
Отправить сообщение для СлаваRa с помощью ICQ Отправить сообщение для СлаваRa с помощью Skype™
@Akopalipsis, вы не правы, describeType работает и показывает статику если в качестве аргумента методу будет передан класс, если же необходимо работать с объектом, то можно сделать так:
Код AS3:
describeType(this["constructor"])
Добавлено через 7 минут
А еще можно вот тут почитать http://www.flasher.ru/forum/blog.php?b=131
__________________
местонахождение

Старый 28.01.2014, 22:11
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 6  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
Да, ошибся, я вот как пробовал -
Код AS3:
package 
{
	public class StorageClass 
	{
		public static const STATIC_PROP:TestClass = new TestClass();
	}
}
Код AS3:
package 
{
	import flash.display.Sprite;
	import flash.utils.describeType;
 
	public class Main extends Sprite 
	{
		public function Main() 
		{
			var storageClass:StorageClass = new StorageClass();
			trace(describeType(StorageClass));//так видит, а вот если ссылку передать, то нет
		}
 
	}
}

Старый 28.01.2014, 23:38
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 7  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Код AS3:
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();
    }
 
}
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 29.01.2014, 01:17
Фенёк вне форума Посмотреть профиль Отправить личное сообщение для Фенёк Найти все сообщения от Фенёк
  № 8  
Ответить с цитированием
Фенёк

Регистрация: May 2011
Сообщений: 221
Ого, оперативно вы )

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

Сегодня-завтра накидаю демку того, что хотелось бы получить в результате, чтобы исключить неоднозначности в вопросах, а то пост писал несколько второпях, уходя с работы. Больше так не буду )

Старый 29.01.2014, 10:06
djyamato вне форума Посмотреть профиль Отправить личное сообщение для djyamato Посетить домашнюю страницу djyamato Найти все сообщения от djyamato
  № 9  
Ответить с цитированием
djyamato
 
Аватар для djyamato

Регистрация: Feb 2006
Сообщений: 884
Записей в блоге: 2
Отправить сообщение для djyamato с помощью ICQ Отправить сообщение для djyamato с помощью Skype™
интересная тема, спасибо всем

Старый 29.01.2014, 11:50
Фенёк вне форума Посмотреть профиль Отправить личное сообщение для Фенёк Найти все сообщения от Фенёк
  № 10  
Ответить с цитированием
Фенёк

Регистрация: May 2011
Сообщений: 221
Итак, поехали.

Для начала приведу исходый текст задания, может быть я чего-то не допонял:

Цитата:
Написать на ActionScript перечисляемый тип и объяснить, почему это хорошо.
Реализуется классами 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;
}
}

Ничего больше в классах UnitType и UnitUpgradeType быть не должно (иначе задание теряет смысл).
Все значения перечисляемого типа могут быть объявлены его статическими константами и только ими. Если это не так - проект падает сразу после компиляции или содержит варнинги.
Есть метод function getElementsList(enumerationClass:Class):Vector.<Enumeration> - отдает все значения перечисления.
Есть метод getElementByValue(value:*, enumClass:Class):Enumeration - отдает элемент перечисления по значению.

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

Для чего такая длинная цепочка наследования классов(Enumeration, UintEnumeration, StringEnumeration), я так и не понял, поскольку условиями задачи запрещается даже вызывать конструктор суперкласса в UnitType и UnitUpgradeType. Из-за чего иерархия классов в моем представлении сложлась следующим, весьма нелепым, образом:

класс Enumeration:
Код AS3:
 
    public class Enumeration
    {
        protected var _value:*;
 
        public function Enumeration()
        {
 
        }
 
        public function get value():*
        {
            return _value;
        }
 
    }
класс UintEnumeration:
Код AS3:
    public class UintEnumeration extends Enumeration
    {
 
        public function UintEnumeration()
        {
 
        }
 
    }
Класс StringEnumeration
Код AS3:
    public class StringEnumeration extends Enumeration
    {
 
        public function StringEnumeration()
        {
 
        }
 
    }
То есть по факту, классы наследники мне пришлось оставить пустыми, потому как больше ничего поделать я с ними не могу.

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

Далее. Я так понял что методы getElementsList(enumerationClass:Class):Vector.<Enumeration> и getElementByValue(value:*, enumClass:Class):Enumeration это методы, напрмер, объекта Main. В этом случае передаваемй параметр все таки имеет существенное значение.

Создать новую тему Ответ Часовой пояс GMT +4, время: 20:07.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Теги
AS3 , enum , static
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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