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