在 As3 中创建具有类名字符串的实例

Posted

技术标签:

【中文标题】在 As3 中创建具有类名字符串的实例【英文标题】:Create instances with string of class' name in As3 【发布时间】:2013-02-02 06:27:42 【问题描述】:

我有 xml 结构,可以在其中加载程序的大部分数据。在这种情况下,我想实例化一个在 xml 中指定的类。我想我可以在 xml 中编写类的名称,然后实例化它并将参数传递给它。事实证明这并不容易!

我试过这样的代码:

            //special objects
        for each (o in xml.Objects[0].special) 
         
            p.x = o.@x;
            p.y = o.@y;
            s.x = o.@width;
            s.y = o.@height;
            trace(o.@classname);
            //var type:Class = o.@classname as Class;
            var type:Class = getDefinitionByName(String(o.@classname)) as Class;

            trace(type);
            objectArray.push(new type(p, s)); 
            trace("special");
        

如您所见,我在 xml 文件的 classname 属性中有我的班级名称。我设法用 getDefinitionByName 获得了定义(至少下一个跟踪显示正确的类名)但是当我尝试实例化它并将它推入数组时,我得到一堆开始的错误

错误 #2136:SWF 文件 file:///Users/tuomas/Dropbox/Flash/ScorpionBox/bin-debug/ScorpionBox.swf 包含无效数据。

知道我应该怎么做吗?

【问题讨论】:

Can I create an instance of a class from AS3 just knowing his name?的可能重复 【参考方案1】:

假设您的 XML 类型定义由 getQualifiedClassName() 获得的限定名称组成,实例化类型并根据需要应用属性。

xml定义的显示对象实例化示例:

package

    import flash.display.DisplayObject;
    import flash.display.Sprite;
    import flash.utils.getDefinitionByName;

    public class XmlParser extends Sprite
    
        public var xml:XML = <objects>
                                <object type="flash.display::Sprite" x="0" y="0"   />
                                <object type="flash.display::MovieClip" x="0" y="0"   />
                             </objects>;

        public function XmlParser()
        
            for each (var object:XML in xml.children())
            
                var type:Class = getDefinitionByName(object.@type) as Class;
                var instance:DisplayObject = new type();
                instance.x = object.@x;
                instance.y = object.@y;
                instance.width = object.@width;
                instance.height = object.@height;

                addChild(instance);
            
        
    

您还可以在序列化为 XML 时描述类型对象,然后通过迭代 XML 的属性将属性应用回对象实例,例如:

package

    import flash.display.DisplayObject;
    import flash.display.Sprite;
    import flash.utils.getDefinitionByName;

    public class XmlParser extends Sprite
    
        public var xml:XML = <objects>
                                <object type="flash.display::Sprite" x="0" y="0"   />
                                <object type="flash.display::MovieClip" x="0" y="0"   />
                             </objects>;

        public function XmlParser()
        
            for each (var object:XML in xml.children())
            
                var type:Class = getDefinitionByName(object.@type) as Class;
                var instance:DisplayObject = new type();
                addChild(instance);

                for each (var attribute:XML in object.@*)
                
                    if(attribute.name() == "type")  continue; 

                    trace("setting: " + attribute.name() + " = " + attribute.toXMLString());
                    instance[attribute.name().toString()] = attribute.toXMLString();
                
            
        
    

【讨论】:

非常感谢!我的问题是我没有在字符串中包含“::”,直到这篇文章才知道它。它现在就像一个魅力:)

以上是关于在 As3 中创建具有类名字符串的实例的主要内容,如果未能解决你的问题,请参考以下文章

ActionScript 3 AS3字符串到类名getDefinitionByName

从字符串中创建具有两位小数的 Double [重复]

在另一列pyspark中创建具有字符串长度的列

AS3 getURL/navigateToURL(如何在AS3中创建可单击的链接)

首先创建字符串然后通过移动语义将其添加到向量或在向量中创建元素是不是具有内存效率?

ActionScript 3 AS3 getURL / navigateToURL(如何在AS3中创建可点击链接)