Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Обращение к статическим константам класса через переменную (http://www.flasher.ru/forum/showthread.php?t=203163)

KumoKairo 04.09.2013 16:13

Обращение к статическим константам класса через переменную
 
Допустим у меня есть несколько классов с заданными константами (количество того-то, массив с тем-то)
Код AS3:

public class RainbowDash
{
        public static const TAIL_COLOR:uint = 0xff00ff;
        public static const NAME:String = "Rainbow Dash";
 
        ...
}
 
public class PinkiePie
{
        public static const TAIL_COLOR:uint = 0x0000ff;
        public static const NAME:String = Pinkie Pie";
 
        ...
}

И если имеется один общий обработчик таких данных, который не знает заранее, какой класс ему попадется, то возникает проблема обращения к этим константам.

Допустим обработчик у нас такой:
Код AS3:

public class MeaninglessMachine
{
        public static function process(classToProcess:Class):void
        {
                trace(classToProcess.NAME);
        }
}

Но не катит - свойство undefined. (И не странно, ведь у Class нет свойства NAME)
Если делать передачу переменной типа Object - та же тема. Если делать через двойные скобки - тоже:
Код AS3:

trace(getDefinitionByName(getQualifiedClassName(_classToProcess)).NAME);

Где собака зарыта?

Я понимаю что можно сделать и другими методами, но стало интересно, как передавать нормальный референц на класс

in4core 04.09.2013 16:35

Использовать интерфейс и геттеры, более адекватная структура будет.

Код AS3:

public function process(classToProcess:IColoredClass):void


KumoKairo 04.09.2013 16:47

Цитата:

Использовать интерфейс и геттеры, более адекватная структура будет.
Цитата:

Я понимаю что можно сделать и другими методами, но стало интересно, как передавать нормальный референц на класс
Тут вопрос не в архитектуре а в самой возможности обращения к статическим полям класса)

zuxul 04.09.2013 16:58

Есть еще вариант объявить аргумент так: classToProcess:*, что отключает проверки, но надежности коду совсем не добавляет.

in4core 04.09.2013 17:02

ну или сделать так classToProcess:Object / Dynamic Class и обращаться так classToProcess["NAME"] прокатит возможно

KumoKairo 04.09.2013 17:07

Цитата:

ну или сделать так classToProcess:Object / Dynamic Class и обращаться так classToProcess["NAME"] прокатит возможно
Забыл написать что так тоже делал - все тот же undefined

СлаваRa 04.09.2013 17:27

Можно достать через describeType, но в вашей задаче, я не уверен, что это хорошая идея.

AlexLucas 04.09.2013 18:31

Цитата:

Использовать интерфейс и геттеры, более адекватная структура будет.
Код AS3:

public function process(classToProcess:IColoredClass):void


А в функцию вы передаёте класс ? Который реализует интерфейс ?

Цитата:

Забыл написать что так тоже делал - все тот же undefined
При classToProcess:* или classToProcess:Object не должно быть undefined.

Inet_PC 04.09.2013 20:15

Банальный и типизированный if/switch не подходит? У Вас, что 100 таких классов?

silin 04.09.2013 21:03

Цитата:

Сообщение от KumoKairo (Сообщение 1145485)
Забыл написать что так тоже делал - все тот же undefined

видимо undefined не из-за динамического доступа, а из-за чего-то еще
Код AS3:

package
{
        import flash.display.Sprite;
 
        public class Main extends Sprite
        {
 
                public function Main():void
                {
                        process(Class1);// NAME : class1
                        process(Class2);// NAME : class2
 
                }
 
                private function process(classToProcess:Class):void
                {
                        trace( "NAME : " + classToProcess["NAME"] );
                }
        }
 
}
 
class Class1
{
        static public const NAME:String = "class1";
}
class Class2
{
        static public const NAME:String = "class2";
}



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

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