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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 15.06.2006, 13:42
Manowar1 вне форума Посмотреть профиль Отправить личное сообщение для Manowar1 Найти все сообщения от Manowar1
  № 1  
Ответить с цитированием
Manowar1

Регистрация: Jan 2002
Адрес: Kharkov
Сообщений: 57
По умолчанию Как создать объект зная имя класса?

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

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

Регистрация: Oct 2005
Адрес: Russia, Moscow
Сообщений: 316
Отправить сообщение для Sneg с помощью ICQ
Если заранее известны предолагаемые классы которые ты можешь вернуть этим методом, то банальный 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 );

Старый 15.06.2006, 15:18
Nirth вне форума Посмотреть профиль Отправить личное сообщение для Nirth Посетить домашнюю страницу Nirth Найти все сообщения от Nirth
  № 3  
Ответить с цитированием
Nirth
4AM Games
 
Аватар для Nirth

блогер
Регистрация: Nov 2002
Адрес: Sofia
Сообщений: 6,264
Записей в блоге: 1
Отправить сообщение для Nirth с помощью ICQ Отправить сообщение для Nirth с помощью AIM Отправить сообщение для Nirth с помощью MSN Отправить сообщение для Nirth с помощью Yahoo Отправить сообщение для Nirth с помощью Skype™
В Flash 8 есть класс mx.utils.ClassFinder
юзать так
Код:
import mx.utils.ClassFinder;
var classReference:Function = ClassFinder.findClass("eu.orangeflash.some.package.SomeClass");
var a = new classReference();
__________________
Я перестал переписывать, начал редактировать, еще лет 15 и я стану писателем ^_^

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

Регистрация: Apr 2004
Адрес: Харьков, Украина
Сообщений: 463
Отправить сообщение для Reijii с помощью ICQ
Цитата:
Сообщение от Nirth
В Flash 8 есть класс mx.utils.ClassFinder
юзать так
Код:
import mx.utils.ClassFinder;
var classReference:Function = ClassFinder.findClass("eu.orangeflash.some.package.SomeClass");
var a = new classReference();
вот и оно.. мда.. открыл ты глаза мне.. я когда делал фабрику мне оч как не хватало такой вещицы... так как eval() не совсем так работает как например в том же php..
ну что поделать.. как грится пользуйтесь поиском по хелп )
__________________
Feсi quod potui, faciant meliora potentes

Старый 15.06.2006, 15:27
7thsky™ вне форума Посмотреть профиль Отправить личное сообщение для 7thsky™ Найти все сообщения от 7thsky™
  № 5  
Ответить с цитированием
7thsky™
Flash Aксакал
 
Аватар для 7thsky™

Регистрация: Jun 2005
Сообщений: 636
Код:
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);
З.Ы. единственное надо позаботиться о том что сам класс будет скомпилирован в свф

Старый 15.06.2006, 15:45
Zionn вне форума Посмотреть профиль Отправить личное сообщение для Zionn Найти все сообщения от Zionn
  № 6  
Ответить с цитированием
Zionn

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

Старый 15.06.2006, 15:47
Nirth вне форума Посмотреть профиль Отправить личное сообщение для Nirth Посетить домашнюю страницу Nirth Найти все сообщения от Nirth
  № 7  
Ответить с цитированием
Nirth
4AM Games
 
Аватар для Nirth

блогер
Регистрация: Nov 2002
Адрес: Sofia
Сообщений: 6,264
Записей в блоге: 1
Отправить сообщение для Nirth с помощью ICQ Отправить сообщение для Nirth с помощью AIM Отправить сообщение для Nirth с помощью MSN Отправить сообщение для Nirth с помощью Yahoo Отправить сообщение для Nirth с помощью Skype™
Цитата:
Самый короткий метод: добавь объект в стейдж затем удаляй.
Потом пиши - я показываю на примере Button
createClassObject(mx.controls.Button, "m_btn",this.getNextHighestDepth())соответстве нно ты можешь создать и другой объект, например TextInput и т.д.
это к чему?
__________________
Я перестал переписывать, начал редактировать, еще лет 15 и я стану писателем ^_^

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

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

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

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

Регистрация: Apr 2004
Адрес: Харьков, Украина
Сообщений: 463
Отправить сообщение для Reijii с помощью ICQ
а чем тебе фабрика не нравится ? зачем клипы отдельные ?
у меня фабрика работает с 50-штк классов и ничего )

а вот то что дал Nirth просто даст мне возможность щаз там нафик убрать гигантский свич )
__________________
Feсi quod potui, faciant meliora potentes

Старый 15.06.2006, 16:43
Manowar1 вне форума Посмотреть профиль Отправить личное сообщение для Manowar1 Найти все сообщения от Manowar1
  № 10  
Ответить с цитированием
Manowar1

Регистрация: Jan 2002
Адрес: Kharkov
Сообщений: 57
Да нет - свитч, как то мне совсем не нравится. Смотри, допустим стороний разроботчик расширяет систему. Ему проще дать интерфейс, который он должен реализовать и всё. А так ему ещё нужно залезть в свитч и дописать свой класс.
Кстати посмотрите реализацию 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[имя класса]

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

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

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

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


 


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


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