2010-09-24 2 views
0

Y a-t-il un moyen pour moi de définir des conversions de types implicites ou explicites dans ActionScript?Conversions de type définies par l'utilisateur dans ActionScript?

Par exemple, je veux définir une conversion de sorte que Array puisse implicitement transtyper MyClass. Sinon, une distribution explicite serait utile. Je sais que je peux toujours le transmettre à mon constructeur, mais je traite de la sémantique ici, et je suis très intéressé par une solution de conversion si elle existe.

Répondre

1

coulée de type dans ActionScript 3

Object(instanceOfOtherObject); 

Works basé sur la propriété valueOf de la classe donnée (si elle est définie). Par conséquent, vous pouvez définir votre classe MyClass en tant que tel:

package { 
    public class MyClass { 

     private var myArray:Array; 

     public function MyClass(inputArray:Array = null) { 
      myArray = (inputArray ? inputArray : new Array()); 
     } 

     public function valueOf():Array { 
      return myArray; 
     } 
    } 
} 

Ensuite, vous serez en mesure d'effectuer cette transtypage:

var mc:myClass = new MyClass(); 
var arr:Array = Array(myClass); 

A ma connaissance, l'inverse est pas une option car la fonction valueOf de Array ne renvoie pas un objet de type MyClass. Rien ne vous empêche de créer un CastableArray qui étend et remplace la fonction valueOf de Array pour qu'il renvoie une instance de MyClass en utilisant le constructeur que j'ai défini ci-dessus, bien que vous puissiez rencontrer d'autres problèmes avec d'autres composants de langage fondamentaux. retourne un tableau dans sa propriété valueOf (la comparaison d'objets vient à l'esprit).

Je n'ai pas fait de test particulier avec cette suggestion suivante, mais si MyClass s'étend de Array et ne définit pas de fonction valueOf, il peut toujours être possible de faire la conversion de type en fonction du constructeur de MyClass et de Flash dans des circonstances où valueOf n'est pas défini.

+0

Très instructif :) Merci! J'ai résolu mon problème en étendant le prototype de Array pour inclure 'Array.prototype.asMyClass = function(): MyClass {}'. Cela me permet de prendre n'importe quel tableau et d'appeler 'theArray.AsMyClass()' et cela fonctionne aussi bien que je peux le demander. –

+0

C'est une solution intelligente. Heureux que ce soit au moins d'une certaine utilité, soyez conscient des pièges de l'énumération tels que définis dans cet article: http://tobyho.com/Modifying_Core_Types_in_ActionScript_3_Using_the_Prototype_Object – Aaron

Questions connexes