Создание класса по его имени

Февраль 27th, 2010 автор: Oleg Antipov

Вот чем мне нравится actionscript 3, так это его гибкостью. Например недавно узнал что в нём можно создать класс, имея на руках только его имя в строке. Для этого надо использовать функцию getDefinitionByName, которая возратит ссылку на нужный нам класс.

Пример:

import flash.utils.*; //не забываем подключить нужную библиотеку
 
var ClassRef:Class = getDefinitionByName("int") as Class; //Создаём нужный нам класс
var num = new ClassRef (123);//Создаём экземпляр нашего класса
trace(num); //Убеждаемся что получили int :)



Эта фича может нам также пригодится например для динамического создания классов наших звуков:

var ClassRef:Class = getDefinitionByName("mySound") as Class; //Создаём нужный нам класс звука
var snd:Sound = (new ClassRef() as Sound);//Создаём экземпляр нашего звука
snd.play(0); //Проверяем тот ли звук мы создали, какой хотели )



Вообщем думаю эта фича очень полезна и может пригодится в различных местах флеш игры :)

Категория: Хитрости

5 Комментариев

  1. Newtom

    Очень нужная вещь, многие думаю мучаются над этой проблемой, особенно в начале изучения AS3.. :smile:

  2. Den

    Не совсем пойму смысл данной конструкции:
    var ClassRef:Class = getDefinitionByName(”Sprite”) as Class; // ClassRef указатель на класс (тип данных) Sprite
    var sp = new ClassRef () as Sprite; // создаем экземпляр класса Sprite

    Если почти тоже самое можно сделать с пом. сл кода:
    var sp:Sprite; // указатель типа Sprite
    sp = new Sprite(); // создаем экземпляр класса Sprite

    Поясни, пожалуйста смысловую разницу.
    Т.е. зачем нам создавать ссылку на клаас а потом с помощью нее создавать экземпляр…

  3. Oleg Antipov

    Самый простой пример – есть три класса – robot, zombie, solder, которые наследуются от базового класса enemyObject. Чтобы создавать эти объекты на экране можно составить следующую функцию:

    function createObject(type:String)
    {
    var ClassRef:Class = getDefinitionByName(type) as Class;
    var cObj:enemyObject = (new ClassRef() as enemyObject);

    allobjects.push(cObj);
    addChild(cObj);
    }

    Ну а дальше можем использовать эту функцию для создания разных врагов

    createObject(”robot”);
    createObject(”zombie”);
    createObject(”solder”);

    Если же писать как ты предлагаешь, то придётся проверять тип и на его основе создавать класс:
    var cObj:enemyObject;
    if(type==”robot”) cObj=new robot(); else
    if(type==”zombie”) cObj=new zombie(); else
    if(type==”solder”) cObj=new solder();

  4. Den

    Спасибо за наглядный пример, да действительно функция полезная, особенно при многочисленной градации объектов, наследующих базовый класс.
    Хороший блог.

  5. Platon

    как раз мне помогло – делал годовой отчет для одной конторы. 800 страниц, каждая – в виде слайда с заданным именем класса вида slide_rus_214 или slide_eng_331 :)
    так просто по номеру обращаюсь )

Оставить комментарий