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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 27.09.2011, 15:25
flax4Noob вне форума Посмотреть профиль Отправить личное сообщение для flax4Noob Найти все сообщения от flax4Noob
  № 1  
Ответить с цитированием
flax4Noob
[+1 15.01.11]

Регистрация: Jan 2011
Сообщений: 70
По умолчанию как создать объект класса, имея его название в переменной?

Добрый день.

Хочу сделать фабрику объектов. Для этого я в функцию передаю строковую переменную "имя класса". Как бы мне внутри функции создать объект этого типа?
Но чтобы не прописывать в функции 100500 кейсов вида
"если 1, то создаем объект крестик"
"если 2, то создаем объект нолик"
Конструкцию
Код AS3:
var myObjName:String="Sprite";
var test = new (myObjName)();
он кушает, но выпадает с ошибкой на этапе выполнения.
"Error #1007: Instantiation attempted on a non-constructor"

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

Старый 27.09.2011, 15:26
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 2  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
getDefinitionByName()

Добавлено через 2 минуты
Но при этом имя класса должно быть полным, т.е. вместе с пакетом.
А что вам мешает передавать сам класс?
__________________
משיח לא בא
משיח גם לא מטלפן

Старый 27.09.2011, 15:32
flax4Noob вне форума Посмотреть профиль Отправить личное сообщение для flax4Noob Найти все сообщения от flax4Noob
  № 3  
Ответить с цитированием
flax4Noob
[+1 15.01.11]

Регистрация: Jan 2011
Сообщений: 70
м.. что значит "передать класс"? Я подгружаю данные из XML. Там названия классов и координаты.

Старый 27.09.2011, 15:39
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 4  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Ну, вы же об этом не упоминали.
__________________
משיח לא בא
משיח גם לא מטלפן

Старый 27.09.2011, 15:59
flax4Noob вне форума Посмотреть профиль Отправить личное сообщение для flax4Noob Найти все сообщения от flax4Noob
  № 5  
Ответить с цитированием
flax4Noob
[+1 15.01.11]

Регистрация: Jan 2011
Сообщений: 70
Чертоффски криво выглядит. =(
Да и в XML теперь придется засовывать полное имя класса через getQualifiedClassName. Беда.

Старый 27.09.2011, 16:07
Котяра вне форума Посмотреть профиль Отправить личное сообщение для Котяра Посетить домашнюю страницу Котяра Найти все сообщения от Котяра
  № 6  
Ответить с цитированием
Котяра
буду краток
 
Аватар для Котяра

модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
Отправить сообщение для Котяра с помощью ICQ Отправить сообщение для Котяра с помощью Skype™
Ну сделайте алиасы свои
типа
Код AS3:
public static  const classAliases:Object = {sprite:Sprite, mc:MovieClip };
 
		public static function getClassByAlias(id:String):Class {
			return classAliases[id];
		}
ну или воспользуйтесь стандартными getClassByAlias и registerClassAlias
__________________
Отряд Котовскага

Старый 27.09.2011, 16:11
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 7  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Цитата:
Да и в XML теперь придется засовывать полное имя класса через getQualifiedClassName. Беда
А как вы хотели? В программе может быть сколько угодно классов с именем "Sprite", но в разных пакетах. Компилятор телепатией не обладает и не может знать какой класс вы хотите использовать.
Тут два варианта или алиасы или полное имя.
__________________
משיח לא בא
משיח גם לא מטלפן

Старый 27.09.2011, 16:18
-De- вне форума Посмотреть профиль Отправить личное сообщение для -De- Найти все сообщения от -De-
  № 8  
Ответить с цитированием
-De-
 
Аватар для -De-

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
Если нельзя будет написать что-то типа
Код 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]();
}
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.


Последний раз редактировалось -De-; 27.09.2011 в 16:40.
Старый 27.09.2011, 16:20
flax4Noob вне форума Посмотреть профиль Отправить личное сообщение для flax4Noob Найти все сообщения от flax4Noob
  № 9  
Ответить с цитированием
flax4Noob
[+1 15.01.11]

Регистрация: Jan 2011
Сообщений: 70
Цитата:
Сообщение от Котяра Посмотреть сообщение
Ну сделайте алиасы свои
ну или воспользуйтесь стандартными 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- Посмотреть сообщение

Код AS3:
protected static var string2Class:Object = {"MyClass1":MyClass1, ""MyClass2":MyClass2};//тут все классы и их названия
О. Во. А я же могу этот массив заполнить из XML, используя getDefinitionBName()?

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

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

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


Последний раз редактировалось flax4Noob; 27.09.2011 в 16:28.
Старый 27.09.2011, 16:34
-De- вне форума Посмотреть профиль Отправить личное сообщение для -De- Найти все сообщения от -De-
  № 10  
Ответить с цитированием
-De-
 
Аватар для -De-

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
Цитата:
Сообщение от flax4Noob Посмотреть сообщение
О. Во. А я же могу этот массив заполнить из XML, используя getDefinitionBName()?
Нет, значение для ключа в этом массиве ж вам взять негде, в getDefinitionBName что писать-то будете?
Я бы рекомендовал закинуть все классы, создаваемые с помощью xml в один package.
Можно ещё вбить руками список пэкэджей (если у вас ещё и стопицот пэкэджей, в которых могут быть эти классы то вам один хрен ничего не поможет) и искать классы по ним при первой встрече.
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.

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

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

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


 


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


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