Apache Adobe Flex TutorialTutoriaux Adobe Flex & AIR en Français

9fév/093

Flex ActionScript – Cast d'objets et opérateur as

Pour "caster" un objet en ActionScript, c'est-à-dire faire une conversion de type, vous avez deux manières différentes. Caster un élément peut-être très pratique, voire parfois inévitable. Par exemple, quand vous utilisez certaines formes de polymorphisme.

Admettons que vous ayez un classe B, sous-classe d'une classe A. Si vous avez besoin d'utiliser une méthode spécifique à B, alors que vous avez un objet de type A, vous devrez faire une conversion de type (Coercition ascendante).

Aussi, si vous conservez dans un tableau ActionScript, tous types d'objets, et qu'au moment du parcours de votre tableau, vous voulez retransformer vos objets dans leur type d'origine, vous devez effectuer un "cast" alias coercition.

La première manière pour effectuer un "cast"est le cast "à l'ancienne" qui consiste à passer l'objet à convertir dans le constructeur du nouvel objet.

Par exemple, on veut convertir une String en Number:

var str:String = "8";
var numb:Number = Number (str);

Ce type de conversion fonctionne très bien si l'opération se passe avec succès. Mais imaginons que vous essayer de convertir deux types incompatibles (un Button en List par exemple):

var btn:Button = new Button();
var lst:List = new List();
lst = List (btn);

Comment Flash Player va-t-il réagir à cette conversion ? Et bien vous allez obtenir une RTE (RunTime Error) du type:

TypeError: Error #1034: Type Coercion failed: cannot convert mx.controls::Button@16ab0479 to mx.controls.List.

On voit ici directement que les types sont incompatibles mais dans une application complexe, on peut avoir besoin absolument de faire une conversion. Alors pour éviter cette RTE, vous pouvez mettre votre instruction dans un try / catch mais cela n'est pas propre (et moins rapide).

Pour remédier à ce problème, ActionScript propose l'opérateur "as". Voici ses caractéristiques:

  • Si vous faites une conversion entre types compatibles, l'opérateur as fera exactement la même chose qu'un cast décrit plus haut
  • Il va retourner null si l'opération de conversion échoue
  • Il ne lancera pas de RTE

Une fois que vous avez fait un cast avec l'opérateur as, vous pouvez donc vérifier immédiatement si la valeur résultante est nulle:

var btn:Button = new Button;
var lst:List;
lst = btn as List;
if (! lst) {mx.controls.Alert.show("Désolé, ce type de conversion est interdit"); }

Attention tout de même, vous ne pouvez utiliser l'opérateur "as" que pour les objets de haut niveau, et pas les types de base (Number…). Ce qui signifie que s'il on reprend notre premier exemple en faisant:

numb = str as Number;

On obtiendra l'erreur suivante:

Implicit coercion of a value of type Number to an unrelated type String

Il faudra donc vous en tenir à la première méthode pour ces types de base:

numb = Number (str);
Remplis sous: ActionScript, Flash Player || Taggé comme: , , Laisser un commentaire

Articles similaires

Commentaires (3) Trackbacks (0)
  1. Merci pour ton info.

    Sans vraiment le savoir, en XML nous faisons donc un cast lors du traitement suivant :

    Actionscript:
    1. private function init(evt:ResultEvent):void{
    2.                
    3.            
    4. MaVariableXML = evt.result as XML;
    5.  
    6. }

  2. Totalement, c'est grâce à ce cast que vous pouvez ensuite utiliser la syntaxe e4x sur MaVariableXML car sinon, ce serai un Object simple.

  3. Il faut préciser aussi qu'en terme de perf' le "as" est beaucoup plus rapide que le cast (cf le bouquin de Thibault Himbert)


Leave a comment

(required)

Aucun trackbacks pour l'instant