【问题标题】:Actionscript 3 : Creating variable objects and assigning class from parsed XML fileActionscript 3:创建变量对象并从解析的 XML 文件分配类
【发布时间】:2009-04-07 20:24:43
【问题描述】:

我已经设置了一个 XML 文件,其中包含将包含在 fla/swf 库中的对象名称。 我希望使用可以快速修改的 XML 文件将对象放置在舞台上,而无需重新编译 fla/swf 文件。当然,定位只能在对象被实例化并添加到舞台时才能完成。问题是以编程方式将解析的 XML 文件名/类配对数据传递到 var 创建中。

XML 文件包含对象名称和类:示例如下:

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

XML 文件解析正确,我设置了一个 ...for...each 循环来为每个对象分配名称/类。 问题在于输入名称/类配对的正确语法,类似于以下内容:

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

我是因为这个而失去理智还是只是暂时无知???**

【问题讨论】:

    标签: flash actionscript-3 variables


    【解决方案1】:

    只是快速跟进,有一种非常直接的方法可以保持灵活性:

    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;
    

    【讨论】:

    • 感谢大家的回复。所有的反应都在球场上,但这个是我需要的。 Nemaste - 阿奇
    【解决方案2】:

    我不确定你想做什么。

    您想创建一个名为 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();
        ...
    }
    

    不确定这是否是您想要做的。我不知道是否有一种方法可以仅从文本中创建一个新球,如果有人知道这样做的方法,我也想知道如何。

    【讨论】:

    • 感谢您快速准确的回复。阿奇
    【解决方案3】:

    根据您的要求,听起来您正在尝试一种工厂模式(工厂方法),其中一个类负责根据外部来源提供的信息动态生成对象。

    我建议您研究一下 Flex 和 ActionScript 的设计模式。我还没有在 Flex 中编写过工厂方法,但它不会比 Java 难多少,这还不错。

    总的来说,我希望您的程序如下所示:

    1. 您的 XML 描述了将要生成的对象(类类型、参数等)。您的示例似乎表明了这一点。
    2. 您有一个 XSD 可以验证 XML 文件是否符合您的程序的预期 - 如果不符合,则会输出相应的错误。我会强烈推荐一些类似的东西来进行验证:你需要有一种机制来保证 XML 是正确的。
    3. 您已经抽象出您期望在 XML 中出现的值。我建议在单独的实用程序类中使用枚举或静态/常量字符串值。
    4. 您有一个 Factory 类,其唯一职责是接收 XML 数据,根据内容生成对象,并将其返回给任何需要它的人。

    显然,第四点是您正在寻找的东西或(我认为)。 CookieOfFortune 的示例显示了此工厂方法可能会看到的内容。但是,我建议您也将字符串值抽象为变量或枚举:

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

    但是,您的第一个参数让我感到困惑。听起来您正在尝试使用动态命名的 reference 创建一个动态对象(例如var &lt;x&gt;:Object,其中&lt;x&gt; 被定义为XML 中的数据)。我不知道这是否可能。我当然认为没有必要。

    【讨论】:

    • 感谢您的详细回复。您的 cmets 很受欢迎,将被考虑参加决赛。非常感谢阿奇
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    • 1970-01-01
    • 1970-01-01
    • 2019-08-25
    • 2011-06-05
    • 1970-01-01
    相关资源
    最近更新 更多