Actionscript 3: Создание переменных объектов и назначение класса из проанализированного XML-файла - PullRequest
1 голос
/ 08 апреля 2009

Я установил XML-файл с именами объектов, которые будут содержаться в библиотеке fla / swf. Я хочу расположить объекты на сцене, используя файл XML, который можно быстро изменить, не перекомпилируя файл fla / swf. Конечно, позиционирование может быть достигнуто только тогда, когда объекты создаются и добавляются на сцену. Проблема заключается в программной передаче проанализированного XML-имени файла / данных сопоставления в создание var.

Файл XML содержит имена объектов и класс: пример следующий:

<objects>
   <object name="myBall" class="Ball"/>
</objects>

XML-файл анализируется правильно, и я настроил ... для ... каждого цикла, чтобы назначить имя / класс каждому объекту. Проблема заключается в правильном синтаксисе для ввода имени / класса, что-то похожее на следующее:

var object.@name:object.@class = new object.@class();

Я сошел с ума от этого или просто временно не знаю ??? **

Ответы [ 3 ]

4 голосов
/ 08 апреля 2009

Просто быстрое отслеживание, есть довольно простой способ сохранить гибкость:

var xml:XML = <object name="myBall" class="Ball">;

// Looks up for a defined symbl/definition with the name 'Ball'    
var Def:Class = getDefinitionByName(xml.@class);

// Creates the instance of the Ball
var instance:* = new Def();

// in case you want to assign a name to the node as a reference on the display list :
addChild(instance).name = @xml.name;
1 голос
/ 08 апреля 2009

Я не уверен, что вы пытаетесь сделать.

Хотите создать объект с именем myBall типа Ball?

var object:Object = new Object();
object[objects.name] = createNewClass(objects.class);

...

function createNewClass(var name:String):Object
{
    if(name == "Ball")
        return new Ball();
    ...
}

Не уверен, что это то, что вы пытаетесь сделать. Я не знаю, есть ли способ создать новый Ball только из текста, если кто-нибудь знает способ сделать это, я также хотел бы знать, как.

0 голосов
/ 08 апреля 2009

Исходя из того, что вы спрашиваете, звучит так, будто вы пытаетесь использовать тип Factory-pattern (Factory Method), где класс отвечает за динамическое создание объектов на основе информации, полученной из внешнего источника.

Я бы рекомендовал изучить шаблоны проектирования для Flex и ActionScript. Я еще не написал Фабричный метод во Flex, но он не может быть намного сложнее, чем Java, что не так уж и плохо.

В общем, вот как я мог бы ожидать, что ваша программа будет выглядеть так:

  1. Ваш XML описывает объект, который будет сгенерирован (тип класса, параметры и т. Д.). Ваш пример, кажется, показывает это.
  2. У вас есть XSD, который может проверить, что файл XML соответствует ожиданиям вашей программы - если это не так, будет выведена соответствующая ошибка. Я бы очень порекомендовал что-то в этом духе для проверки: вам нужен механизм, который гарантирует правильность XML.
  3. Вы абстрагировали ожидаемые значения в XML. Я бы порекомендовал использовать значения Enums или static / constant String в отдельном служебном классе.
  4. У вас есть класс Factory, единственной обязанностью которого является получение данных XML, генерация объектов на основе содержимого и возврат их тем, кто в них нуждается.

Четвертый пункт, очевидно, это то, что вы ищете или (я думаю). Пример CookieOfFortune показывает, как может выглядеть этот фабричный метод. Однако я бы порекомендовал вам также абстрагировать значения String в переменную или Enum:

...
var BALL_CLASS_TYPE:String = "Ball";
...
function createNewClass(var name:String):Object {
    if (name == BALL_CLASS_TYPE)
        return new Ball();
}

Ваш первый параметр, однако, сбивает меня с толку. Похоже, вы пытаетесь создать динамический объект с динамически именованным ссылкой на него (например, var <x>:Object, где <x> определяется как данные в XML). Я не знаю, возможно ли это вообще. Я бы, конечно, подумал, что в этом нет необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...