我刚写完自己的collecion 类,我真的很想用for each 或simple for 构造让它可迭代,或者只是用collection[key] 表示法访问元素。
我已经写了一个getElementAt(index):MyOwnElement
函数,但是使用它并不像使用方括号那样性感,甚至不要让我开始迭代..
有什么办法吗?
我刚写完自己的collecion 类,我真的很想用for each 或simple for 构造让它可迭代,或者只是用collection[key] 表示法访问元素。
我已经写了一个getElementAt(index):MyOwnElement
函数,但是使用它并不像使用方括号那样性感,甚至不要让我开始迭代..
有什么办法吗?
您应该看一下mx.utils.Proxy
- 从中继承您的集合类(并将其设置为动态)可能使您可以访问您想要的一些功能(或者至少是足够接近的功能。)
例如,下面是该方法文档的摘录nextValue()
:
“允许通过索引号枚举代理对象的属性以检索属性值。但是,您不能枚举代理类本身的属性。此函数支持在对象上实现
for...in
和for each..in
循环以检索所需的值。”
您不能覆盖 AS3 中的运算符。
我认为您可以将 'getElementAt' 更改为一个短名称,例如 'at':) 或将 getElementAt 设置为临时变量....
取决于您收藏的内部结构。如果您的集合存储为数组,那么您可以使用属性来实现方括号效果:
/*** MyCollection class ***/
private var elementHolder : Array;
public function get getElementAt() : Array{
return elementHolder;
}
/*** Some other class******/
public function main() : void{
trace("Element at 3: " + myCollection.getElementAt[3] );
}
如果您的集合未存储在数组中,则您可以将其转换为数组(如 java Collection 的 toArray() 方法)。
例如,如果您的集合是一个链表:
/*** MyCollection class ***/
public function get getElementAt() : Array{
var temp : Array = new Array();
while( node.next != null{
temp.push( node );
}
return temp;
}
/*** Some other class******/
public function main() : void{
trace("Element at 3: " + myCollection.getElementAt[3] );
}