我想创建一个主要容纳Vector
的类。该类将有一些方法来处理Vector中的项目。
我目前遇到的问题是,我无法解决如何动态创建Vector
的实例。到目前为止,我已经尝试了这个并且类似但没有运气:
public class List
{
private var _content:Vector;
public function List(type:Class)
{
_content = new Vector.<type>();
}
}
答案 0 :(得分:6)
以下是我如何动态构造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动态构造不同数据类型的向量。
不完全是你所追求的,但它可能对其他人有帮助。
答案 1 :(得分:5)
This post by Paul Robertson(以前是Adobe的高级ActionScript开发人员/编写者)提供了有关如何声明Vectors的更多信息:
Vector类允许(要求)指定它的类型 包含在编译时 - 包括变量声明和何时 创建实例。
因为type参数是文字,所以必须在编译时提供。实际上,在编译时检查对Vector的每个引用,但.shift()
和.unshift
除外,它们在运行时被检查。
Adobe's article on indexed arrays提供了一些有趣的信息。实际上,它提到严格的编译时类型安全性是Vector的关键特性之一。
简而言之:不可能使用变量来设置Vector的类型,因为type参数是文字和编译时要求。
希望有所帮助!
其他参考文献:
答案 2 :(得分:4)
另一个可能对您有用的选择是使用接口;向量不必是具体类型。因此,如果您可以抽象出您的对象可以遵守的一些常见合同,那么请使用它。例如,假设您想要一个可渲染对象列表,您可以说:
public interface IRenderable {
function renderTo(obj:DisplayObject):void;
}
var _content:Vector.<IRenderable> = new Vector.<IRenderable>();
然后,您可以将尽可能多的不同具体类型推送到Vector中,只要它们实现IRenderable
接口即可。因此,虽然ActionScript 3中的泛型实际上只是语法编译糖,但就像Andrew Odri所说,你可能能够绕过它,这取决于你特别想要做什么。
答案 3 :(得分:1)
听起来你只需要一个阵列!仅使用Vector&lt;&gt;来改善性能。因为类型在编译时被整理出来。如果你想要一个“动态”类型,那么你应该使用一个数组。
答案 4 :(得分:0)
最初的问题是几年前,但我觉得分享这个问题是因为它可能有助于其他人。 它启发了Matthew Peterson的答案,但它假设内部类名称少了一点(它只假设。&lt;&gt;语法)。
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();
}