Форум 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=169083)

flax4Noob 27.09.2011 15:25

как создать объект класса, имея его название в переменной?
 
Добрый день.

Хочу сделать фабрику объектов. Для этого я в функцию передаю строковую переменную "имя класса". Как бы мне внутри функции создать объект этого типа?
Но чтобы не прописывать в функции 100500 кейсов вида
"если 1, то создаем объект крестик"
"если 2, то создаем объект нолик"
Конструкцию
Код AS3:

var myObjName:String="Sprite";
var test = new (myObjName)();

он кушает, но выпадает с ошибкой на этапе выполнения.
"Error #1007: Instantiation attempted on a non-constructor"

Гуглинг продолжаю, но что-то не могу запрос чтоль составить нормальный =/

alatar 27.09.2011 15:26

getDefinitionByName()

Добавлено через 2 минуты
Но при этом имя класса должно быть полным, т.е. вместе с пакетом.
А что вам мешает передавать сам класс?

flax4Noob 27.09.2011 15:32

м.. что значит "передать класс"? Я подгружаю данные из XML. Там названия классов и координаты.

alatar 27.09.2011 15:39

Ну, вы же об этом не упоминали.

flax4Noob 27.09.2011 15:59

Чертоффски криво выглядит. =(
Да и в XML теперь придется засовывать полное имя класса через getQualifiedClassName. Беда.

Котяра 27.09.2011 16:07

Ну сделайте алиасы свои
типа
Код AS3:

public static  const classAliases:Object = {sprite:Sprite, mc:MovieClip };
 
                public static function getClassByAlias(id:String):Class {
                        return classAliases[id];
                }

ну или воспользуйтесь стандартными getClassByAlias и registerClassAlias

alatar 27.09.2011 16:11

Цитата:

Да и в XML теперь придется засовывать полное имя класса через getQualifiedClassName. Беда
А как вы хотели? В программе может быть сколько угодно классов с именем "Sprite", но в разных пакетах. Компилятор телепатией не обладает и не может знать какой класс вы хотите использовать.
Тут два варианта или алиасы или полное имя.

-De- 27.09.2011 16:18

Если нельзя будет написать что-то типа
Код AS3:

getDefinitionByName("myPackageForAllNeeded."+xmlClassName);

То тогда уж лучше фабрику забабахать)
Код AS3:

protected static var string2Class:Object = {"MyClass1":MyClass1, "MyClass2":MyClass2};//тут все классы и их названия
public static createClassByName(name:String):Object {
  if(string2Class[name] == null) {
    throw new Error("no class " + name");
  }
  return new string2Class[name]();
}


flax4Noob 27.09.2011 16:20

Цитата:

Сообщение от Котяра (Сообщение 1035322)
Ну сделайте алиасы свои
ну или воспользуйтесь стандартными getClassByAlias и registerClassAlias

Чем это будет хуже создания массива со списком всех имен? Тогда в XML можно хранить индексы из этого массива. Ведь один фик придется для каждого нового объекта прописывать алиасы. А если пойти по этой дорожке, то плавно переходим к варианту 100500 строк в функции. Ведь тогда не надо будет делать два вызова непонятных функций. А сразу создавать объект. Это должно будет побыстрее быть.

вместо
Код AS3:

var testDef:Class = getDefinitionByName(testArray[testIndex]) as Class;
var testResult = new testDef();

придется сделать

Код AS3:

switch (testIndex){
        case 1: var testResult = new Sprite();
        case 2: var testResult = new MovieClip();
}

Разница при добавлении новых классов минимальна, а работать должно побыстрее. Но все-равно криво. =(( Можно забыть добавить какой-нить класс и вуаля.

Добавлено через 7 минут
Цитата:

Сообщение от -De- (Сообщение 1035327)

Код AS3:

protected static var string2Class:Object = {"MyClass1":MyClass1, ""MyClass2":MyClass2};//тут все классы и их названия


О. Во. А я же могу этот массив заполнить из XML, используя getDefinitionBName()?

То есть. В XML делаю две секции: описание классов, и само содержимое. Загружая описание, я заполняю массив "string2Class" значениями.

А вторую часть обрабатываю уже функцией "createClassByName".

Затея такова, что мне совершенно не хочется переписывать методы загрузки/сохранения при дальнейшей модификации.

-De- 27.09.2011 16:34

Цитата:

Сообщение от flax4Noob (Сообщение 1035330)
О. Во. А я же могу этот массив заполнить из XML, используя getDefinitionBName()?

Нет, значение для ключа в этом массиве ж вам взять негде, в getDefinitionBName что писать-то будете?
Я бы рекомендовал закинуть все классы, создаваемые с помощью xml в один package.
Можно ещё вбить руками список пэкэджей (если у вас ещё и стопицот пэкэджей, в которых могут быть эти классы то вам один хрен ничего не поможет) и искать классы по ним при первой встрече.


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

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