Просмотр полной версии : Динамическое создание классов
Universe
29.09.2011, 14:42
Пытаюсь создать класс по передаваемому имени класса:
class_name = "Item";
var className:Class = getDefinitionByName(class_name) as Class;
var item = new className(xmlList.item[i].@img);
пишет ошибку
ReferenceError: Error #1065: Variable Item is not defined.
at global/flash.utils::getDefinitionByName()
at com.main.index::BasicScroller/::createItems()
at com.main.index::BasicScroller/::xmlLoaded()
at flash.events::EventDispatcher/flash.events:EventDispatcher::dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at com.main::XMLLoader/::xmlLoaded()
at flash.events::EventDispatcher/flash.events:EventDispatcher::dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at flash.net::URLLoader/flash.net:URLLoader::onComplete()
если просто написать
var item = new Item(xmlList.item[i].@img);
то работает
Cheburashka
29.09.2011, 14:46
Вероятно, это Класс из библиотеки. Если да, то нужно сначала создать его экзампляр типа:
new MyImage88();
А лучше положить все ваши мувиклипы во флеше в 1 мувиклип с классом, например, AllImages и создать его екземпляр:
new AllImages();
Тогда все, кто в нем лежат автоматически буду готовы к динамическому созданию через getDefinitionByName().
UPD: Прошу прощения не досмотрел, попробуйте написать просто перед вашим методом из первого поста:
new Item('');
Universe
29.09.2011, 14:56
UPD: Прошу прощения не досмотрел, попробуйте написать просто перед вашим методом из первого поста:
Код AS3:
new Item('');
тут проблема в том, что это необязательно будет Item, это может быть любой другой класс.
А лучше положить все ваши мувиклипы во флеше в 1 мувиклип с классом, например, AllImages и создать его екземпляр:
как то не вижу смысла создавать все объекты в проекте до их реального использования!
А что если так?
var ways_scroller = new BasicScroller("xml/index/ways.xml", 30, ways_mc, getQualifiedClassName(Item));
var className:Class = getDefinitionByName(class_name) as Class;
var item = new className(xmlList.item[i].@img);
Добавлено через 1 минуту
т.е. передавать полный путь к классу, вместо просто имени
Добавлено через 2 минуты
кстати заметил одну особенность при использовании getQualifiedClassName - он выдаёт строку вида
"com.main.index::Item"...почему 2 двоеточия перед именем класса? Чем эта строка отличается от com.main.index.Item ?
gloomyBrain
29.09.2011, 15:02
//trace(getDefinitionByName("Sprite")); - тут будет ошибка
trace(getDefinitionByName("flash.display.Sprite")); // тут все нормально
У меня и без экземпляров прекрасно работает.
А Вы уверены, что в либе есть символ класса Item?
Добавлено через 1 минуту
опоздал))
Добавлено через 9 минут
var ways_scroller = new BasicScroller("xml/index/ways.xml", 30, ways_mc, getQualifiedClassName(Item));
Universe, в таком случае можно и просто сам Класс передавать как параметр в конструктор, но Вы же класс-то не знаете)))
Universe
29.09.2011, 15:21
в принципе можно и класс...усложнил немного сам себе задачу)) Но думаю в случае если путь к классу генерируется при помощи for или ещё при каком условии описанный выше способ будет правельнее чем передавать сам класс)
А что на счёт
кстати заметил одну особенность при использовании getQualifiedClassName - он выдаёт строку вида
"com.main.index::Item"...почему 2 двоеточия перед именем класса? Чем эта строка отличается от com.main.index.Item ?
Добавлено через 16 минут
Universe, в таком случае можно и просто сам Класс передавать как параметр в конструктор, но Вы же класс-то не знаете)))
Или вот допустим такой вариант - класс создаётся только на этапе компиляции, т.е. это пустышка которая привязана к объекту в библиотеке через Linkage, будет ли такой класс при передаче работать?
Но думаю в случае если путь к классу генерируется при помощи for или ещё при каком условии описанный выше способ будет правельнее чем передавать сам класс)То есть "правильно" когда родитель, выполнив всю работу по парсингу XML, вытащив или сформировав наконец имя класса, заставляет ребенка доделывать последний шаг за него? Это очень похоже на частые ответы на этом форуме, знаете – когда кто-то пишет название фреймворка например, а дальше автор вопроса копирует это название и вставляет его в гугл, чтобы найти ССЫЛКУ. А ведь можно было передать сразу эту ссылку, как и делают добропорядочные граждане.
"Думаю, в случае если", то гораздо логичнее иметь класс, разбирающийся с сериализацией, а не заставлять бедные экземплярчики рыскать по интернету в поисках класса по строке. Особенно если эти экземплярчики создаются в цикле в количестве пятисот штук. Логичней один раз найти ссылку на Класс и отдавать им эту ссылку, а не поисковый запрос.
Universe
29.09.2011, 16:00
понятно:)
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.