2011-12-29 58 views
3

我想創建一個主要包含Vector的類。該類將有一些方法來處理Vector中的項目。如何在AS3中動態創建矢量?

我現在遇到的問題是我無法弄清楚如何動態創建Vector的實例。到目前爲止,我已經嘗試過這一點,但沒有運氣:

public class List 
{ 
    private var _content:Vector; 

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

回答

5

This post by Paul Robertson(原高級的ActionScript開發者/ Adob​​e的作家)提供的載體是如何申報多一點信息:

Vector類允許(要求)您指定它將 包含在編譯類型時間 - 既適用於變量聲明,也適用於創建實例的時間。

因爲類型參數是一個文字,它必須在編譯時提供。事實上,除了在運行時檢查的.shift().unshift之外,在編譯時檢查向量的每個引用。

Adobe's article on indexed arrays提供了一些更有趣的信息。實際上,它提到嚴格的編譯時類型安全性是Vector的關鍵特性之一。

簡而言之:不可能使用變量來設置Vector的類型,因爲類型參數是文字和編譯時間的要求。

希望有幫助!

其他參考:

+0

偉大的細節和資源,謝謝! – Marty 2011-12-29 03:53:09

+0

沒有汗水,很高興它是有幫助的; Paul Robertson編寫了所有Adobe的Vector文檔,因此他是這方面的很好的資源:) – 2011-12-29 03:57:14

+0

「簡而言之:無法使用變量來設置Vector的類型,因爲類型參數是文字和編譯時間需求。」 - 垃圾。馬修彼得森回答如下。 – 2012-01-13 23:25:34

1

聽起來像你只是需要一個數組!性能僅在Vector <>中得到改進,因爲類型在編譯時被排除。如果你想要一個「動態」類型,那麼你應該使用一個數組。

+0

你會這樣想,但是兩者之間的性能差異在遊戲環境中太大了。 – Marty 2011-12-29 03:54:24

4

,可能爲你工作是使用一個接口的另一種選擇;矢量不一定是具體的類型。所以如果你能抽象出你的對象可以遵守的一些常見契約,那就用它來代替。例如,假設你想渲染對象的列表,你可以說:

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

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

然後你就可以推儘可能多的不同的具體類型爲載體,只要它們實現的IRenderable接口。因此,雖然ActionScript 3中的泛型實際上只是語法編譯器糖,就像Andrew Odri所說的那樣,但您可能可以解決這個問題,具體取決於您正在嘗試執行的操作。

+0

我不得不承認,這是一個非常有建設性和有趣的方法,很好。 – Marty 2011-12-29 03:59:58

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動態構造不同數據類型的向量。

不完全是你以前的樣子,但它可能會幫助其他人。

0

原來的問題是一個幾歲,但我覺得分享這個,因爲它可能會幫助其他人。 它的靈感來源於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(); 
    }