繁体   English   中英

如何在AS3中动态创建向量?

[英]How can I create Vectors dynamically in AS3?

我想创建一个主要容纳Vector 该类将有一些方法来处理Vector中的项目。

我目前遇到的问题是我无法弄清楚如何动态创建Vector实例。 到目前为止,我已经尝试了这个和类似的没有运气:

public class List
{
    private var _content:Vector;

    public function List(type:Class)
    {
        _content = new Vector.<type>();
    }
}

这是我如何动态构造BitmapData的向量(MouseCursorData类所需):

var vectorClassOfBitmapData:Class = Class(getDefinitionByName("__AS3__.vec::Vector.<flash.display::BitmapData>"));

var bitmapDataVector:* = new vectorClassOfBitmapData(1,true);

以上与编译时相同:

var bitmapDataVector:* = new Vector.<BitmapData>(1, true);

通过这种方式,您可以在运行时组合类定义字符串,并使用getDefinitionByName动态构造不同数据类型的向量。

不完全是你所追求的,但它可能会帮助别人。

Paul Robertson (以前是Adobe的高级ActionScript开发人员/编写者) 发表的这篇文章提供了有关如何声明Vectors的更多信息:

Vector类允许(要求)指定它在编译时将包含的类型 - 包括变量声明和创建实例时的类型。

因为type参数是文字,所以必须在编译时提供。 实际上,在编译时检查对Vector的每个引用,但.shift().unshift ,它们在运行时被检查。

Adobe关于索引数组的文章提供了一些有趣的信息。 实际上,它提到严格的编译时类型安全性是Vector的关键特性之一。

简而言之:不可能使用变量来设置Vector的类型,因为type参数是文字和编译时间要求。

希望有所帮助!

其他参考文献:

可能对您有用的另一个选择是使用接口; 向量不必是具体类型。 因此,如果您可以抽象出您的对象可以遵守的一些常见合同,那么请使用它。 例如,假设您想要一个可渲染对象列表,您可以说:

public interface IRenderable {
    function renderTo(obj:DisplayObject):void;
}

var _content:Vector.<IRenderable> = new Vector.<IRenderable>();

然后,只要它们实现IRenderable接口,您就可以将尽可能多的不同具体类型推送到Vector中。 因此,虽然ActionScript 3中的泛型实际上只是语法编译糖,但就像Andrew Odri所说,你可能能够绕过它,这取决于你特别想要做什么。

听起来你只需要一个阵列! 只有使用Vector <>才能提高性能,因为类型在编译时被整理出来。 如果你想要一个“动态”类型,那么你应该使用一个数组。

最初的问题是几年前,但我觉得分享这个问题是因为它可能对其他人有所帮助。 它的灵感来自Matthew Peterson的答案,但它假设内部类名称少一些(它只假设。<>语法)。

    function CreateVectorOf(subtype:Class)
    {
        var vecname:String = getQualifiedClassName(Vector);
        var subname:String = getQualifiedClassName(subtype);
        var vecclass:Class = getDefinitionByName(vecname + ".<" + subname + ">") as Class;
        return new vecclass();
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM