0

不明なクラスからベクターを作成しようとしていますが、失敗します。その方法についてのアイデアはありますか?

これは私が試したものです:

var vector:Vector = new Vector(); // throw exception

function base():void{
var vector:Vector.<String> = createVector(String);// throw classCastException
}

function createVector(cls:Class):*{
     var array:Array = new Array();
     for(var i:int = 0; i < 10; i++){
         var element:cls = new cls();
          array.push(element);
     }

     return Vector(array);
}
4

2 に答える 2

2

ベクターはパラメーターの型を想定しているため、これを思い通りに行うことはできませんが、getQualifiedClassNameを使用してクラス情報を取得すると、ベクターを呼び出すことができる文字列を作成できます。getDefinitionByNameを使用するコンストラクター:

元。

// get class parameter name
var className:String=getQualifiedClassName(String);

// get the Vector class object for the given class
var o:Object=getDefinitionByName("__AS3__.vec::Vector<"+className+">");

// call the constructor
var v:*=o.prototype.constructor(["hello", "world"]);

したがって、関数は次のように記述できます。

    public function createVector(cls:Class):*{
        var cn:String = getQualifiedClassName(cls);
        var o:Object = getDefinitionByName("__AS3__.vec::Vector.<"+cn+">");
        var array:Array = [];
        for(var i:int = 0; i < 10; i++){
            var element:* = new cls();
            array.push(element);
        }
        return o.prototype.constructor(array);
    }

wonderfl での実例: http://wonderfl.net/c/pkjs

于 2012-10-15T08:35:17.930 に答える
1

@Patrickの回答に基づいて、実用的な解決策を見つけました。

見てみな:

function createVector(cls:Class):*{
        var className:String = getQualifiedClassName(cls);
        var vectorClass:Class = getDefinitionByName("__AS3__.vec::Vector.<"+className+">") as Class;

        var vector:* = new vectorClass(10);        
        for(var i:int = 0; i < 10; i++){
            var element:MyClass = new cls(); // may be Object or Object extends cls
            vector[i] = element;
        }

        return vector;
    }
于 2012-10-21T11:34:59.980 に答える