2010-06-22 61 views
8

我正在嘗試對Array進行一個變體以用於特定目的。當我有以下內容:Actionscript 3中的擴展數組(Flex)

public class TileArray extends Array { 
    // Intentionally empty - I get the error regardless 
} 

爲什麼我不能這樣做?

var tl:TileArray = [1,2,3]; 

儘管事實上,我可以做到這一點

var ar:Array = [1,2,3]; 

我收到的錯誤是這樣的:

Implicit coercion of a value with static type Array to a possibly unrelated type

+5

http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/Array.html說'你可以擴展Array類並覆蓋或添加方法。但是,您必須將子類指定爲動態的,否則您將失去將數據存儲在數組中的能力。「# – Amarghosh 2010-06-22 08:07:26

回答

13

不是擴展陣列,您可以編寫自己的類的暴露Array的所有方法。通過採用代理類,你可以重定向所有默認Array方法到一個內部數組,但仍然可以靈活地添加自己的方法:

package 
{ 
    import flash.utils.flash_proxy; 
    import flash.utils.Proxy; 

    use namespace flash_proxy; 

    dynamic public class ExampleArray extends Proxy 
    { 
     private var _array:Array; 

     public function ExampleArray(...parameters) 
     { 
      _array = parameters; 
     } 

     override flash_proxy function callProperty(name:*, ...rest):* 
     { 
      return _array[name].apply(_array, rest); 

     } 

     override flash_proxy function getProperty(name:*):* 
     { 
      return _array[name]; 
     } 

     override flash_proxy function setProperty(name:*, value:*):void 
     { 
      _array[name] = value; 
     } 

     public function getSmallestElement():* 
     { 
      var helper:Array = _array.concat().sort(); 
      return helper[0]; 
     } 

    } 
} 

例如:

var test:ExampleArray = new ExampleArray(8,7,6,5,4,3,2,1); 
trace(test.getSmallestElement()); // 1 
test.sort(); 
trace(test); // 1,2,3,4,5,6,7,8 
+0

+1。我只是添加一個鏈接到文檔的示例,它顯示了這種技術:http://livedocs.adobe.com/flex/2/langref/flash/utils/Proxy。html#includeExamplesSummary – 2010-06-23 04:08:17

+0

乾淨的例子Quasimondo :) – bigp 2012-05-24 20:02:58

3

[]只創建一個陣列。它不能用於創建Array的子​​類。

使用新功能「擴展」數組的好方法是編寫操作常規數組的獨立實用程序函數。最重要的是,這將允許您對任何數組執行任何操作,而不僅限於使用您的子類創建的數組。

下面是包含實用函數陣列的類的一個簡單的例子:

package com.example.utils 
{ 
    public class ArrayUtil 
    { 
     public static function traceArray(array:Array):void 
     { 
      trace(array.length, "[" + array + "]"); 
     } 
    } 
} 

用法:

ArrayUtil.traceArray([1, 2, 3]); //output: 3 [1,2,3] 
+0

是的,我知道我可以做到這一點。我比其他任何東西都更注重語法糖。 – 2010-06-22 22:23:48

+0

如果要將變量和屬性添加到數組,則這沒有幫助。 – n4pgamer 2013-10-03 17:53:20

+0

作爲一個不向數組添加變量和屬性的人,這是一個功能,而不是一個bug。 ;) – joshtynjala 2013-10-10 19:11:16

1

[1,2,3]是速記(或語法糖)爲new Array(1,2,3)。考慮到這一點,您的代碼失敗的原因似乎更加明顯。

TileArrayArray,因爲TileArray延伸Array,但逆是不正確的:不是每個ArrayTileArray。因此,您無法通過Array,其中TileArray是預期的。這就是爲什麼你得到編譯器錯誤。

由於對象的實際類型是Array,因此投射只會將編譯時的錯誤推遲到運行時間,這與TileArray確實無關。

如果你想擴展Array的功能(也可以添加一些語法糖),你可能想要考慮擴展Proxy,因爲它已經被建議。請記住它的性能較差,所以如果您計劃大量使用這個類,這可能不是最好的主意。