2009-01-15 6 views
4

Je viens juste d'écrire ma propre classe collecion, et je voudrais vraiment la rendre itérative avec le pour chaque ou le simple pour construire, ou simplement pour accéder aux éléments avec la notation collection [clé] .Opérateur Overload [] dans AS3

J'ai écrit une fonction getElementAt(index):MyOwnElement, mais en utilisant, n'est pas aussi sexy que l'utilisation des brachets carrés, ne me laisse même pas commencer à itérer ..

Est-il possible?

Répondre

9

Vous devriez jeter un oeil à mx.utils.Proxy - votre classe de sous-classement collection de (. ou du moins quelque chose qui est assez proche) que (et le définir comme dynamique) peut vous donner accès à certaines des fonctionnalités que vous voulez

Par exemple, voici un extrait de la documentation de la méthode nextValue():

"Autoriser s énumération des propriétés de l'objet par proxy par numéro d'index à récupérer les valeurs de propriété. Toutefois, vous ne peut pas énumérer les propriétés de la classe proxy eux-mêmes. Cette fonction supports de mise en œuvre for...in et for each..in boucles sur l'objet à récupérer les valeurs souhaitées. »

1

Il y a un très bon article sur la mise en œuvre du modèle de iterator dans AS3 here

0

Vous ne pouvez pas remplacer l'opérateur en AS3.
Je pense que vous pouvez changer « getElementAt » à un nom court aime « à » :) ou assgin getElementAt à une variable temp ....

0

dépend de la structure interne de votre collection. Si votre collection est stockée sous forme d'un tableau, vous pouvez utiliser properities pour obtenir un effet de support carré.


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

Si votre collection ne sont pas stockées dans un tableau peut-être vous pouvez le convertir en un tableau (méthode comme toArray() de la collection java)

par exemple, si votre collection est une liste chaînée:


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