2013-10-03 25 views
1

我试图延伸Array。我想在将对象添加到我的数组时进行某种通知,然后执行一些额外的检查/操作。AS-3 - 如何覆盖数组/实现括号语法→[]?

最有趣的部分是一样的东西:

  • array[2] = object;
  • array.hello = "world";

这是我被困在:

public dynamic class Array2 extends Array 
{ 
} 

var array: Array2 = new Array2(); 
array[2] = "hello world"; // need to do some verification before adding 


这是如此称为 括号语法,我想要使用。如果我可以使用这种语法,我可以在内部使用一个数组来向它添加有效的对象。这更多的是使用数组的感觉,所以我可以用我的类的对象替换使用的数组。

var obj: MyClass = new MyClass(); 
obj[2] = "test"; 


事件当一个新的对象分配会帮助我。

var arr: Array = []; 
arr[2] = "test"; // fire event with index and object ? 

回答

1

您可以创建你的类,它扩展flash.utils.Proxy

下面是一个简单

import flash.utils.Proxy; 
import flash.utils.flash_proxy; 

public dynamic class MyArray extends Proxy { 

    private var acturalArray:Array; 

    public function MyArray() { 
     super(); 

     acturalArray = [];    
    } 

    override flash_proxy function setProperty(name:*, value:*):void { 

     //do some verification before set value, 
     if (acturalArray[name] != undefined) { 
      return; 
     } 

     acturalArray[name] = value; 
    } 

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

这里是如何使用它

var p:MyArray = new MyArray(); 
p[1] = 5; 
p[1] = 2; 

var d:int = p[1];//d will be equal to 5 
0

为什么你需要继承它?使用[]语法还是使其成为动态类是绝对必要的?你可以很容易地做这样的事情,而不是:

public class Test { 

     private var arr:Array = []; 

     public function Test() { 
     } 

     public function add(o:*):void { 
      arr.push(o); 
      //dispatch event 
     } 
    } 
} 

编辑(看到你后): 那么,在这种情况下,你基本上需要声明类的动态。我不太清楚如何在没有计时器/框架的情况下检查这种情况。

+0

您的测试类是某种回退计划。 – n4pgamer

1

我认为你需要的是一个Proxy类。我正要在这里写一小段代码,但后来看到文档页面已经有一些很好的例子来显示使用情况。