我希望能夠通過Vectors約作爲參考。現在,如果方法採用Vector.<Object>
,則傳遞Vector.<TRecord>
(其中TRecord直接從Object繼承)不起作用。凡方法只需要簡單對象;說vec: Object
,然後傳遞矢量是可能的。一旦進入此方法,需要在某個階段進行明確的演員才能再次訪問vec
作爲Vector。不幸的是,一個演員似乎做了一個副本,這意味着在多個Flex ListCollectionView中包裝一個是無用的;每個ListCollectionView將指向一個不同的Vector。傳遞矢量。 <T>引用作爲對象,鑄造造成副本
在ArrayCollection中使用數組並沒有出現這樣的問題,但是我失去了Vector的安全性,整潔性(代碼應該足夠乾淨以避免吃掉)和性能優勢。
有沒有一種方法可以將它們作爲參考以通用的方式進行轉換或傳遞,而不會沿途複製?在這個例子中,IRecord是一個與{r/w id:int & name:String}屬性的接口,但它可以是一個類,比如TRecord {id:int;名稱:字符串}或任何其他可用的類型。
protected function check(srcVec: Object): void
{
if (!srcVec) {
trace("srcVec is null!");
return;
}
// srcVec = (@b347e21)
trace(srcVec.length); // 4, as expected
var refVec: Vector.<Object> = Vector.<Object>(srcVec);
// refVec = (@bc781f1)
trace(refVec.length); // 4, ok, but refVec has a different address than srcVec
refVec.pop();
trace(refVec.length); // 3 ok
trace(srcVec.length); // 4 - A copy was clearly created!!!
}
protected function test(): void
{
var vt1: Vector.<IRecord> = new Vector.<IRecord>; // (@b347e21) - original Vector address
var vt2: Vector.<Object> = Vector.<Object>(vt1); // (@bbb57c1) - wrong
var vt3: Vector.<Object> = vt1 as Vector.<Object>; // (@null) - failure to cast
var vt4: Object = vt1; // (@b347e21) - good
for (var ix: int = 0; ix < 4; ix++)
vt1.push(new TRecord);
if (vt1) trace(vt1.length); // 4, as expected
if (vt2) trace(vt2.length); // 0
if (vt3) trace(vt3.length); // vt3 is null
if (vt4) trace(vt4.length); // 4
if (vt1) trace(Vector.<Object>(vt1).length); //
trace("calling check(vt1)");
check(vt1);
}
感謝DeadMG的迴應。所以它純粹是一個接口的問題與Object類不相容?無關:As3確實允許我將實現IRecord接口的對象推送到Vector中。雖然。爲了簡單起見,我將使用Vector。