似乎使用迭代器模式是目前 AS3 中在系统中传递集合的最佳方式,同时保证它不会被修改。
我使用的IIterator接口是基于 Java Iterator建模的,但我没有实现remove()方法,因为这被 Java 社区中的许多人认为是设计错误,因为它允许用户删除数组元素。下面是我的IIterator实现:
public interface IIterator
{
function get hasNext():Boolean
function next():*
}
然后由 ArrayIterator、VectorIterator 等类实现。
为方便起见,我还在具体的 Iterator 类上扩展了Proxy ,并通过覆盖nextNameIndex()和nextValue()方法为 AS3 中的for-each循环提供支持。这意味着通常使用数组的代码在使用我的IIterator时不需要更改。
var array:Array = ["one", "two", "three"]
for each (var eachNumber:String in array)
{
trace(eachNumber)
}
var iterator:IIterator = new ArrayIterator(array)
for each (var eachNumber:String in iterator)
{
trace(eachNumber)
}
唯一的问题是......用户无法查看IIterator接口并知道他们可以使用for-each循环来迭代集合。他们必须查看 ArrayIterator 的实现才能看到这一点。