Подтвердить что ты не робот

Могу ли я создать экземпляр класса из AS3, просто зная его имя?

Могу ли я создать экземпляр класса из AS3, просто зная его имя? Я имею в виду строковое представление, например FlagFrance

4b9b3361

Ответ 1

Создавать экземпляры классов динамически по имени. Для этого можно использовать следующий код:

 //cc() is called upon creationComplete
   private var forCompiler:FlagFrance; //REQUIRED! (but otherwise not used)

   private function cc():void
   {
      var obj:Object = createInstance("flash.display.Sprite");
   }

   public function createInstance(className:String):Object
   {
      var myClass:Class = getDefinitionByName(className) as Class;
      var instance:Object = new myClass();
      return instance;
   }

Документы для getDefinitionByName говорят:

"Returns a reference to the class object of the class specified by the name parameter."

В приведенном выше коде нам нужно было указать возвращаемое значение как класс? Это связано с тем, что getDefinitionByName также может возвращать функцию (например, flash.utils.getTimer - функцию уровня пакета, которая не принадлежит ни одному классу). Поскольку тип возвращаемого значения может быть либо функцией, либо классом, команда Flex указала тип возвращаемого значения как объект, и вы должны выполнить приведение при необходимости.

Приведенный выше код очень похож на пример, указанный в документах, но в некотором смысле это плохой пример, потому что все будет отлично работать для flash.display.Sprite, но попытайтесь сделать то же самое с пользовательским классом, и вы, вероятно, закончите со следующей ошибкой:

ReferenceError: Error #1065: Variable [name of your class] is not defined.

Причиной ошибки является то, что вы должны иметь ссылку на свой класс в своем коде - например, вам нужно создать переменную и указать ее так:

private var forCompiler:SomeClass;

Без этого ваш класс не будет скомпилирован в .swf во время компиляции. Компилятор включает только классы, которые фактически используются (а не только импортированы). Он делает это, чтобы оптимизировать размер .swf. Таким образом, необходимость объявлять переменную не должна считаться надзорностью или ошибкой, хотя хакерство должно объявлять переменную, которую вы не используете напрямую.

Ответ 2

Да, используйте getDefinitionByName:

import flash.utils.getDefinitionByName;

var FlagFranceClass:Class = getDefinitionByName("FlagFrance");
var o:* = new FlagFranceClass();