Оператор перегрузки [] в AS3 - PullRequest
4 голосов
/ 15 января 2009

Я только что закончил писать свой собственный класс коллекции, и мне бы очень хотелось сделать его итеративным с помощью for for each или simple for, или просто получить доступ к элементам с нотацией collection [key].

Я написал getElementAt(index):MyOwnElement функцию, но ее использование не так сексуально, как использование квадратных скобок, даже не позволяйте мне начать с итерации.

Есть ли способ?

Ответы [ 4 ]

9 голосов
/ 15 января 2009

Вы должны взглянуть на mx.utils.Proxy - подклассификация класса вашей коллекции из этого (и установка его как динамического) может дать вам доступ к некоторым функциям, которые вы хотите (или, по крайней мере, к тому, что достаточно близко.)

Например, вот выдержка из документации метода nextValue():

"Разрешает перечисление прокси свойства объекта по номеру индекса получить значения свойств. Тем не менее, вы не может перечислить свойства Прокси класс сами. эта функция поддерживает реализацию циклов for...in и for each..in на объекте получить нужные значения. "

1 голос
/ 15 января 2009

Есть довольно хорошая статья о реализации шаблона итератора в AS3 здесь

0 голосов
/ 15 января 2009

Зависит от внутренней структуры вашей коллекции. Если ваша коллекция хранится в виде массива, вы можете использовать свойства для достижения эффекта квадратной скобки:


/*** 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] );
}

Если ваша коллекция не хранится в массиве, возможно, вы можете преобразовать ее в массив (например, метод toArray () java Collection).

например, если ваша коллекция представляет собой связанный список:


/*** 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] );
}
0 голосов
/ 15 января 2009

Вы не можете переопределить оператор в AS3.
Я думаю, что вы можете изменить 'getElementAt' на короткое имя лайков 'at' :) или присвойте getElementAt временную переменную ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...