Le transtypage en ActionScript 2 et 3

Marc Alcaraz

♪

- Titre : Le transtypage en ActionScript 2 et 3

- Auteur : Marc Alcaraz

- Parution : 7 juin 2007

- Licence : Copyright ® 2006-2007 Marc Alcaraz. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Introduction

- II. Le transtypage en ActionScript 2

- II-A. Première technique au niveau de l'héritage

- II-B. Deuxième technique avec utilisation d'une interface

- III. Le transtypage en ActionScript 3

- IV. Conclusion

I - Introduction

Le « Transtypage » ou « dynamic cast » existe dans tous les langages POO qui utilisent le typage fort et l'ActionScript n'échappe pas à son utilisation depuis Flash MX2004 et la compilation en AS2.

Il arrive qu'on utilise le transtypage sans trop y réfléchir et finalement il est souvent très pratique de pouvoir forcer le compilateur ActionScript de passer outre un typage fort sur une variable.

Je vais essayer de poser maintenant deux types de transtypages en AS2 (valables en AS3) pour illustrer l'utilisation de cette technique.

II - Le transtypage en ActionScript 2

II-A - Première technique au niveau de l'héritage

// code AS2
class A {

// ----o constructor

public function A()
{
//
}

// ----o Public Methods

public function methodA():Void
{
trace("methodA") ;
}

}

class B extends A {

// ----o Constructor

public function B ()
{
//
}

// ----o Public Methods

public function methodB():Void
{
trace("methodB") ;
}

}

// code principal

var a:A = new B() ;

// a.methodB() ; // erreur compilateur ici.

B(a).methodB() ; // fonctionne parfaitement avec le "dynamic cast"

Dans l'exemple au-dessus, la variable a est de type A et va être instanciée avec la classe B qui hérite de A. Donc pas de problème au niveau du compilateur. Or si l'on veut ensuite utiliser directement une méthode de la classe B sur l'instance, l'appel de cette méthode va être impossible ! On utilise cette technique pour brider justement une variable et en la limitant si possible à une utilisation stricte des méthodes propres à sa super classe.

Vous voyez bien au-dessus qu'il est assez simple de transtyper la variable en utilisant un surtypage B(a) et du coup, il est possible d'utiliser la méthode « methodB » de la classe B sur l'instance.

Il arrive parfois qu'on ne sache pas à l'avance si un objet sera défini avec une classe ou une autre et il est bien pratique de pouvoir se baser sur une super classe (qui peut être abstraite) pour déclarer certaines fonctionnalités et s'assurer du bon fonctionnement du code par la suite. Maintenant si vous avez besoin d'utiliser ensuite une méthode spécifique d'une classe qui hérite du type défini au départ et bien le Transtypage est très important.

II-B - Deuxième technique avec utilisation d'une interface

// code AS2

interface IA {

function methodA1():* ;

}

class A implements IA {

// ----o constructor

public function A()
{
//
}

// ----o Public Methods

public function methodA1():Void
{
trace("methodA1") ;
}

public function methodA2():Void
{
trace("methodA2") ;
}

}

// Test

var a:IA = new A() ;

a.methodA1() ; // pas d'erreur, le compilateur trouve bien la methode.

// a.methodA2() ; // erreur compilateur

A(a).methodA2() ; // "dynamic cast" sur la variable, tout fonctionne maintenant.

Nous obtenons en gros la même problématique que pour la technique 1. La méthode methodA2 n'est pas définie dans l'interface IA, mais je souhaite utiliser cette méthode sur ma variable typée IA et qui instancie tout de même la classe A qui implémente IA. Le Transtypage ici fonctionne parfaitement et l'appel de la méthode se fait sans problème ensuite.

III - Le transtypage en ActionScript 3

En AS3, il y a un nouveau mot clé : as qui permet, à mon avis, de faire un dynamic cast encore plus élégant que ce que nous pouvions le faire en AS2…

Je pense qu'un exemple sera beaucoup plus intéressant qu'un long discours, je reprends l'exemple du dessus avec l'utilisation d'une interface et j'utilise cette fois-ci, le as pour débloquer le problème de typage.

// code AS3 dans votre fichier contenant votre classe Main !
package
{

class MainClass
{

}

}

interface IA {

function methodA1():void ;

}

class A implements IA {

// ----o constructor

public function A()
{
//
}

// ----o Public Methods

public function methodA1():void
{
trace("methodA1") ;
}

public function methodA2():void
{
trace("methodA2") ;
}

}

// Test

var a:IA = new A() ;

a.methodA1() ;

(a as A).methodA2() ; // "dynamic cast" et utilisation de as

Vous pouvez tester rapidement votre code comme je viens de le faire dans le fichier principal de votre classe « main » de votre projet AS3 dans Flex2. Il suffit de mettre le code en dehors du package pour tester !! Cela marche très bien pour faire des tests rapides comme sur la timeline de Flash et j'utilise cette technique, pas besoin de toujours coder dans la classe principale, c'est vraiment bien !

IV - Conclusion

Pour conclure, avec l'arrivée des mots clés is et as, on peut dire que l'AS3 possède ici deux outils bien utiles. Je vous conseille de lire attentivement dans la référence du langage AS3 tout ce qui concerne ces deux mots clés, car même s’ils semblent bien inoffensifs, je pense que vous allez comme moi beaucoup les utiliser à présent