Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Как создать объект зная имя класса? (http://www.flasher.ru/forum/showthread.php?t=81250)

Manowar1 15.06.2006 13:42

Как создать объект зная имя класса?
 
На вход метода подаётся строковое название класса, нужно вернуть объект данного класса, как это можно сделать?

Sneg 15.06.2006 15:06

Если заранее известны предолагаемые классы которые ты можешь вернуть этим методом, то банальный 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 );


Nirth 15.06.2006 15:18

В Flash 8 есть класс mx.utils.ClassFinder
юзать так
Код:

import mx.utils.ClassFinder;
var classReference:Function = ClassFinder.findClass("eu.orangeflash.some.package.SomeClass");
var a = new classReference();


Reijii 15.06.2006 15:20

Цитата:

Сообщение от Nirth
В 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..
ну что поделать.. как грится пользуйтесь поиском по хелп )

7thsky™ 15.06.2006 15:27

Код:

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);

З.Ы. единственное надо позаботиться о том что сам класс будет скомпилирован в свф

Zionn 15.06.2006 15:45

Самый короткий метод: добавь объект в стейдж затем удаляй.
Потом пиши - я показываю на примере Button
createClassObject(mx.controls.Button, "m_btn",this.getNextHighestDepth())соответственно ты можешь создать и другой объект, например TextInput и т.д.

Nirth 15.06.2006 15:47

Цитата:

Самый короткий метод: добавь объект в стейдж затем удаляй.
Потом пиши - я показываю на примере Button
createClassObject(mx.controls.Button, "m_btn",this.getNextHighestDepth())соответстве нно ты можешь создать и другой объект, например TextInput и т.д.
это к чему?

Manowar1 15.06.2006 16:10

Первый вариант, который мне пришёл в голову, создать пустой мувиклип в библиотеке, сделать линкейдж на класс, имя будет передаваться в фабрику, а она аттачит класс и возвращает объект. Но это ерунда какая-то, получается для каждого нового класса нужно создавать мувиклип, вообщем это подход через заднее место. Нужно было нечто, типа класса Class в Java, иначе нормальной фабрики не получится.

Вообщем Nirth просто зажёг, за что ему большое спасибо!!!
Один вопрос меня терзает фигли разработчики в документацию по 8-ке не включили описание пакета mx.utils ??

Reijii 15.06.2006 16:14

а чем тебе фабрика не нравится ? зачем клипы отдельные ?
у меня фабрика работает с 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[имя класса]

Другими словами класс должен засветится во флеше хотябы в составе пакета.

Nirth 15.06.2006 16:45

7thsky™ так и сказал=)

Manowar1 15.06.2006 17:04

А ну да, как-то я пропустил, а класс вкомпиливается mtask'ом ежели fla перекомпиливать лень.


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

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