Кажется, что использование шаблона Iterator - лучший способ в настоящее время в AS3 передавать коллекцию по системе, гарантируя, что она не будет изменена.
Используемый мной интерфейс IIterator смоделирован на Java Iterator , но я не реализую метод remove () , так как это считается проектом ошибка многих в сообществе Java из-за того, что он позволяет пользователю удалять элементы массива Ниже моя IIterator реализация:
public interface IIterator
{
function get hasNext():Boolean
function next():*
}
Затем это реализуется такими классами, как ArrayIterator, VectorIterator и т. Д.
Для удобства я также расширяю Proxy на своих конкретных классах Iterator и обеспечиваю поддержку циклов for-each в AS3 путем переопределения nextNameIndex () и nextValue () методы. Это означает, что код, который обычно использует массивы, не нуждается в изменении при использовании моего 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.