2008-09-09 6 views
15

L'une des choses qui me manque le plus dans ActionScript est l'absence de surcharge de l'opérateur, en particulier ==. Je contourne ce problème en ajoutant une méthode "Compare" à mes classes, mais cela n'aide pas dans beaucoup de cas, comme lorsque vous voulez utiliser des choses comme le dictionnaire intégré.Manque de surcharge de l'opérateur dans ActionScript 3.0

Existe-t-il un bon moyen de contourner ce problème?

Répondre

12

Non.

Mais il ne fait pas de mal à ajouter equals méthodes pour vos propres classes. J'essaie de ne jamais utiliser == lors de la comparaison d'objets (il en va de même pour ===, ce qui est la même chose pour les objets) puisqu'il vérifie seulement identité. Malheureusement, toutes les collections de Flash et de Flex supposent que l'identité est la seule mesure d'égalité requise.

Il y a des indices dans Flex que quelqu'un voulait remédier à ce problème à un moment donné, mais il semble que cela a été abandonné: il y a une interface appelée IUID, et il est mentionné dans le Guide du Flex Developer, mais il est pas utilisé n'importe où. Même les collections de Flex ne l'utilisent pas pour déterminer l'égalité. Et puisque vous demandez une solution pour Flash, cela ne vous a peut-être pas aidé de toute façon.

J'ai écrit un peu plus à ce sujet (dans le contexte de Flex) sur mon blog: Is there no equality?.

+0

Ce n'est pas un problème. Les collections de bas niveau doivent utiliser l'égalité des instances. Tout autre type de vérification d'égalité est complètement arbitraire et devrait être bien défini dans une méthode égale. Il devrait être très évident si vous voulez une égalité d'instance ou une vérification arbitraire de l'égalité des données lorsque vous codez quelque chose. En général, la seule fois où vous souhaitez effectuer des vérifications d'égalité des données (vérifications d'une clé d'objet particulière) consiste à traiter des objets de données distants ou des enregistrements de base de données identifiables par une clé particulière. Il n'y a pas d'implémentation générique dans les collections, car il est trivial à implémenter. – Triynko

+0

Je viens de créer une collection de méthodes d'aide dans une classe DataUtils avec une signature de méthode comme 'indexOfValue (collection: *, valeur: *, match_field_or_function: *): int;' La méthode peut simplement itérer sur la collection et en extraire champ de chaque objet pour la comparaison avec * value *, ou peut exécuter chaque objet à travers une fonction dont le résultat est comparé à * value *. Le paramètre * match_field_or_function * gère même les noms de champs à plusieurs parties à forer, tels que "data.id" sur une collection d'éléments de liste ayant chacun une propriété de données contenant n'importe quel type d'objet avec un champ id. – Triynko

4

Oui il peut être fait (mais attention, son hacky): http://filimanjaro.com/2012/operators-overloading-in-as3-javascript-too-%E2%80%93-workaround/

Dans le tutoriel j'ai écrit sur + =, - = surcharge de l'opérateur. Mais c'est aussi possible avec ==, je peux en dire plus à ce sujet si ce n'est pas clair. Ah, l'approche a un inconvénient (dans de rares cas, elle peut même être dangereuse). Réfléchissez à deux fois, avant de l'utiliser dans une production.

EDIT:

Après tests, il semble que le truc avec + =, - = ne pas appliquer à == opérateur (ce qui est logique). Désolé pour les informations trompeuses.

+1

C'est totalement fou. C'est vraiment hacky, mais c'est l'une des choses les plus cool que j'ai vues en AS3. – thedayturns

Questions connexes