Просмотр полной версии : Как создать объект зная имя класса?
Manowar1
15.06.2006, 13:42
На вход метода подаётся строковое название класса, нужно вернуть объект данного класса, как это можно сделать?
Если заранее известны предолагаемые классы которые ты можешь вернуть этим методом, то банальный switch:
function getClassByName(className:String):Object{
switch (className) {
case "XML" :
return new XML();
break;
case "Color" :
return new Color();
break;
..............................
default :
return null;
};
};
trace(getClassByName("Color") instanceof Color );
В Flash 8 есть класс mx.utils.ClassFinder
юзать так
import mx.utils.ClassFinder;
var classReference:Function = ClassFinder.findClass("eu.orangeflash.some.package.SomeClass");
var a = new classReference();
В Flash 8 есть класс mx.utils.ClassFinder
юзать так
import mx.utils.ClassFinder;
var classReference:Function = ClassFinder.findClass("eu.orangeflash.some.package.SomeClass");
var a = new classReference();
вот и оно.. мда.. открыл ты глаза мне.. :eek: я когда делал фабрику мне оч как не хватало такой вещицы... так как eval() не совсем так работает как например в том же php..
ну что поделать.. как грится пользуйтесь поиском по хелп )
import mx.utils.ClassFinder;
// метод один
var lConstructor1:Function = ClassFinder.findClass ('mx.controls.List');
var c:MovieClip = createClassObject (lConstructor1, 'listView1', 1);
c.dataProvider = ['sdfsdfsd', 'sdfsdfsdf', 'sdfsdfsdfsd', 'sdfsdf'];
c.setSize (100, 100);
c.move (0, 0);
// метод два
function getClassByName (path:String):Function {
return Function (eval ('_global.' + path));
}
var lConstructor2:Function = getClassByName ('mx.controls.List');
var d:MovieClip = createClassObject (lConstructor2, 'listView2', 2);
d.dataProvider = ['sdfsdfsd', 'sdfsdfsdf', 'sdfsdfsdfsd', 'sdfsdf'];
d.setSize (100, 100);
d.move (0, 101);
З.Ы. единственное надо позаботиться о том что сам класс будет скомпилирован в свф
Самый короткий метод: добавь объект в стейдж затем удаляй.
Потом пиши - я показываю на примере Button
createClassObject(mx.controls.Button, "m_btn",this.getNextHighestDepth())соответственно ты можешь создать и другой объект, например TextInput и т.д.
Самый короткий метод: добавь объект в стейдж затем удаляй.
Потом пиши - я показываю на примере Button
createClassObject(mx.controls.Button, "m_btn",this.getNextHighestDepth())соответстве нно ты можешь создать и другой объект, например TextInput и т.д.
это к чему?
Manowar1
15.06.2006, 16:10
Первый вариант, который мне пришёл в голову, создать пустой мувиклип в библиотеке, сделать линкейдж на класс, имя будет передаваться в фабрику, а она аттачит класс и возвращает объект. Но это ерунда какая-то, получается для каждого нового класса нужно создавать мувиклип, вообщем это подход через заднее место. Нужно было нечто, типа класса Class в Java, иначе нормальной фабрики не получится.
Вообщем Nirth просто зажёг, за что ему большое спасибо!!!
Один вопрос меня терзает фигли разработчики в документацию по 8-ке не включили описание пакета mx.utils ??
а чем тебе фабрика не нравится ? зачем клипы отдельные ?
у меня фабрика работает с 50-штк классов и ничего )
а вот то что дал Nirth просто даст мне возможность щаз там нафик убрать гигантский свич )
Manowar1
15.06.2006, 16:43
Да нет - свитч, как то мне совсем не нравится. Смотри, допустим стороний разроботчик расширяет систему. Ему проще дать интерфейс, который он должен реализовать и всё. А так ему ещё нужно залезть в свитч и дописать свой класс.
Кстати посмотрите реализацию classFinder.
class mx.utils.ClassFinder
{
/**
Find a class constructor by it's name.
@param fullClassName String containing the name of the class to be searched.
@return Function Constructor for the class.
*/
public static function findClass(fullClassName : String) : Function
{
if (fullClassName == null) return null;
var result = _global;
var tokens = fullClassName.split(".");
for (var i = 0; i < tokens.length; i++)
{
result = result[tokens[i]];
}
if (result == null)
{
_global.__dataLogger.logData(null, "Could not find class '<classname>'",
{classname: fullClassName}, mx.data.binding.Log.BRIEF);
}
return result;
}
}
т.е. всё по сути своидится к return _global[имя класса]
Другими словами класс должен засветится во флеше хотябы в составе пакета.
Manowar1
15.06.2006, 17:04
А ну да, как-то я пропустил, а класс вкомпиливается mtask'ом ежели fla перекомпиливать лень.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.