Actionscript 3 从函数参数动态实例化类型化向量?

Actionscript 3 从函数参数动态实例化类型化向量?,actionscript-3,class,dynamic,vector,constructor,Actionscript 3,Class,Dynamic,Vector,Constructor,对于我试图开发的一个游戏,我正在编写一个资源池类,以便在不调用“new”操作符的情况下回收对象。我希望能够指定池的大小,并且希望它是强类型的 基于这些考虑,我认为向量将是我的最佳选择。然而,由于Vector是最后一个类,所以我不能扩展它。所以,在这种情况下,我想我应该使用组合而不是继承 我看到的问题是-我想用两个参数实例化这个类:size和class type,我不确定如何将类型作为参数传递 以下是我尝试过的: public final class ObjPool { private v

对于我试图开发的一个游戏,我正在编写一个资源池类,以便在不调用“new”操作符的情况下回收对象。我希望能够指定池的大小,并且希望它是强类型的

基于这些考虑,我认为向量将是我的最佳选择。然而,由于Vector是最后一个类,所以我不能扩展它。所以,在这种情况下,我想我应该使用组合而不是继承

我看到的问题是-我想用两个参数实例化这个类:size和class type,我不确定如何将类型作为参数传递

以下是我尝试过的:

public final class ObjPool
{
    private var objects:Vector.<*>;

    public function ObjPool(poolsize:uint, type:Class)
    {
        objects = new Vector.<type>(poolsize);  // line 15
    }
}
目的是指定大小和类型


双重编辑:如果有人无意中发现了这个问题,想寻找答案,请研究一下。在撰写本文时,它们还没有在ActionScript3中实现。祝你好运。

在被告席上拍摄,但是试试这个:

var classType:Class = getDefinitionByName(type) as Class;
...
objects = new Vector.<classType>(poolsize);  // line 15
var classType:Class=getDefinitionByName(type)作为类;
...
对象=新向量。(池大小);//第15行

放下话筒这是一个有趣的问题(+1!),主要是因为我以前从未尝试过。从您的示例来看,这似乎是不可能的,我确实觉得奇怪,可能与编译器的工作方式有关。我怀疑你为什么要这么做。向量相对于数组的性能优势主要是它被类型化的结果,但是您显式地将其类型声明为未定义,这意味着您失去了性能增益。那么为什么不直接使用数组呢?只是食物而已

编辑

我可以确认这是不可能的,这是一个开放的错误。看这里:很抱歉听到这个消息


泰勒。

你最好尽量远离新事物,但:

我在actionscript中读到的所有关于Vector的文章都说它必须是强类型的。所以 这不应该起作用

编辑:我是说这是不可能的。 看看这是否有用


我已经尝试了一段时间,多米尼克·坦克雷迪的帖子让我觉得即使你不能去:

objects = new Vector.<classType>(poolsize);
objects=新向量(池大小);
你可以这样做:

public final class ObjPool
{
    private var objects:Vector.<*>;

    public function ObjPool(poolsize:uint, type:Class)
    {
        var className   : String = getQualifiedClassName(type);
        var vectorClass : Class  = Class(getDefinitionByName("Vector.<" + className + ">"));
        objects = new vectorClass(poolsize);
    }
}
公共最终类ObjPool
{
私有变量对象:向量。;
公共函数ObjPool(池大小:uint,类型:Class)
{
变量className:String=getQualifiedClassName(类型);
VarVectorClass:Class=Class(getDefinitionByName(“Vector”);
对象=新矢量类(池大小);
}
}
我用int和一个自定义类都试过了,看起来效果不错。当然,你必须检查你是否真的从中获得了速度,因为物体是一个向量。flash可能会进行一些隐式类型检查,这会抵消使用向量所获得的速度


希望这能有所帮助

我真的不明白使用向量的意义。。不妨使用数组

不管怎样,我刚刚想出了一种动态创建向量的方法:

public function getCopy (ofVector:Object):Object
{
    var copy:Object = new ofVector.constructor;
   // Do whatever you like with the vector as long as you don't need to know the type

    return copy;
}

祝你好运我怀疑这是不可能的(因为Vector.是一个例外情况,ActionScript并不真正支持泛型或模板)。在编译时输入到对象池构造函数中。@alxx你知道-我实际上没有想到这一点。该解决方案并没有很好地抽象出所有内容,而且因为AS3通过引用传递,所以它为类外的私有变量提供了一个引用空间。它并不像我希望的那样被控制,但是如果链接列表不能满足我的需要,我可能会考虑它。我怀疑这有什么不同,如果它确实如此,我会很感兴趣,但是它和原来的例子完全一样,只是移动类类型被宣布的地方。我试过了,它被编译了,但是向量上的DescripteType显示它是Sprite类型。所以我又恢复并编译了一次…它用同样的问题编译。尝试了一些其他的东西,想知道…然后决定把它键入int-它仍然编译为Sprite。重新启动FlashDevelop,但现在它根本无法编译?我的编译器闹鬼了吗PFlashDevelop没有“clean”功能(很遗憾),所以我删除了我的SWF,认为需要完全重新编译。获取了以下错误-\src\ObjPool.as(15):col:46错误:将Class类型的值隐式强制为不相关的类型字符串。嘿,午餐肉…这太奇怪了。也许向量认为“类”实际上是一个类。。。而不是班级类型。不,这不是目的。我想输入向量,并给它一个固定的长度,但我想通过我的类动态地选择向量类型,这样我就可以创建一个只包含一种对象类型的池(我在实例化该类时选择)。通过这样做,我将获得向量固定长度迭代和类型检查的所有好处。如果我能让它工作,也就是说。Class类型的变量是这样做的正确方法吗?我想把一个类型作为一个参数通过这个veriable,并用它来实例化我的向量,但我以前从来没有这样做过。如果可能的话,我希望避免使用字符串,因为任何实例都需要完整的包名。[为了澄清,我这样称呼我的类:“var I:ObjPool=newobjpool(5000,int);”)哎哟!那太糟糕了,但至少我不是在做什么。不过,我阅读了该链接中的注释,我确实理解编译时的复杂性,因为向量使用连续内存(据我所知)。这真是太遗憾了,因为拥有这个功能会带来很多可能性,但我想我必须找到另一种方法——也许,一个链表可能会最有效。谢谢你的链接!似乎不再是个虫子了。在Flash CS6中,我可以运行以下代码:
import Flash.utils.getDefinitionByName;var c:Class=flash.utils.getDefinitionByName(“\uuu AS3\uuuuu.vec::Vector.”)
public function getCopy (ofVector:Object):Object
{
    var copy:Object = new ofVector.constructor;
   // Do whatever you like with the vector as long as you don't need to know the type

    return copy;
}