En gros dans la propriété virtuelle "function2" Flash considère qu'il n'est pas possible de renvoyer un objet de type Function dans une fonction qui doit renvoyer un objet de type * ??? Alors que le type * reste un type dynamique qui permet de faire sortir n'importe quel type d'objet ? Très étrange donc ce genre d'alerte ?

Il est vrai que le code ci-dessus n'est pas vraiment très "standard" mais imaginons que dans une classe nous ayons besoin de stocker en mémoire une fonction pour le réutiliser plus tard.. si si ! cela peut arriver ! Par exemple avec une adaptation de la classe Tween bien connue de tous et la nécessité d'utiliser une fonction de "easing" pour changer l'effet appliqué sur l'interpolation.

Imaginons donc un bout du code de cette classe Tween avec le script ci-dessous :

package
{
    import flash.events.EventDispatcher ;
 
    public class Tween extends EventDispatcher
    {
 
        public function Tween()
        {
                // code
        }
 
        public function get easing():*
        {
            return _easing ;
        }
 
        public function set easing( easing:* ):void
        {
            if ( easing is Function )
            {
                _easing = easing as Function ;
            }
                else if ( easing is Easing )
            {
                _easing = (easing as Easing).ease ;
            }
            else
            {
                _easing = function(t:Number, b:Number, c:Number, d:Number):Number
                {
                    return ( ( c * t ) / d ) + b ; // linear easing
                }
            }
        }
 
        private var _easing:Function ;
 
        // ... reste du code de la classe
    }
}

Avec Easing une interface simple permettant d'implémenter des classes simples pour chaque type de transition : Bounce, Back, etc. Cette interface doit juste définir une méthode ease() personnalisable.

package
{
    interface Easing
    {
        function ease ( t:Number , b:Number , c:Number , d:Number ):Number ;
    }
}

Dans la classe Tween définie plus haut, j'ai envie de définir une propriété virtuelle r/w "easing" qui peut prendre des objets de type Easing mais aussi des objets de type Function simples... Je suis obligé de typer les 2 fonctions get et set de ma propriété virtuelle avec le type * (impossible de typer différemment les 2 fonctions).

Dans Flash le problème du "warning" indésirable apparait sur cette classe au niveau de la fonction "get" de la propriété virtuelle "easing". Il est clair que le code ci-dessus même si il est "discutable" n'est pas mauvais en soit et que dans tous les cas l'application malgré ce warning l'application fonctionne sans soucis.

A noter que pour éviter ce warning dans Flash sur une fonction qui retourne un objet de type *, il suffit de forcer le type de l'objet de retour de la fonction avec le type "Object" :

public function get easing():*
{
    return _easing as Object ;
}

Plus de message d'alerte après ce petit hack, mais cela reste tout de même à mon sens une solution tirée par les cheveux.

Je code très peu dans l'environnement auteur de Flash en privilégiant son utilisation uniquement pour la création des assets graphiques et des animations et je préfère largement ensuite charger mes swfs d'assets dynamiquement dans mon application principale codée dans FDT et ensuite il suffit de prendre la main sur les éléments graphiques via leurs simple noms d'occurrences.

Ce process de travaille laisse beaucoup plus de souplesse au graphiste, qui n'a plus d'excuse pour trouver l'ActionScript "compliqué" vu que le seul code qui lui ai demandé c'est un stop() de temps en temps sur une image clé, quelques étiquettes sur des images clés et surtout d'indiquer les noms d'occurrences sur les clips importants de l'application.

Bon finalement plus de "peur" que de mal .. mais franchement ils ont à mon sens simplifié à mort le code dans Flash CS3/4 en permettant au développeur débutant de coder sans se prendre trop la tête (pas besoin d'importer les classes natives, etc.) mais avec ce genre de "warning" sans queue ni tête.. pas facile pour un débutant de comprendre les rouages de l'ActionScript vous ne pensez pas ?