Aprés maintenant quelques un grand nombre de lignes de code en AS3, j'ai noté quelques comportements bizarres...

  • la propriété "constructor" de la classe Object ne semble pas être déclarée comme publique. Donc, on se retrouve avec une contradiction entre la doc et la réalité... et surtout aucun moyen de connaitre la classe qui a servie à créer l'objet. Un workaround existe utilisant describeType:
public class ClassUtils
{
        public static function getConstructor(o : *) : Class {
                var clname:String = describeType(o).@name.toXMLString();
                var claz:Class = getDefinitionByName(clname) as Class;
                return claz;
        }
}
  • imaginons que je crée une interface vide (ainsi que son implémentation) qui me sert uniquement à indiquer l'appartenance à deux types simultanément: en gros, une interface qui hérite de deux interfaces. Si ces deux interfaces mères ont une méthode commune et que j'utilise mon interface fille pour typer une variable, le compilateur va me remonter une erreur comme quoi la référence à cette méthode est ambigue. Ceci est tout à fait inconcevable, car il est clair que l'implémentation utilisée sera évidemment unique! Bon, étant donné que ce charabia doit être super flou, voici un exemple:
// Voir plus bas pour les différentes interfaces
package {
        import flash.display.Sprite;
       
        import itf.IDataSet;
        import itf.IList;
        import cl.DataSet;
       
        public class ASPlayground extends Sprite
        {
                public function ASPlayground()
                {
                        var ids:IDataSet = new DataSet;
                        trace(ids.getLength()); // Erreur du compilateur: Référence ambiguë à getLength.
                        trace((ids as IList).getLength()); // Marche bien !
                }
               
        }
}

package itf
{
        public interface IList
        {
                function getLength() : int;
        }
}

package itf
{
        public interface ICollection
        {
                function getLength() : int;
        }
}

// Cette interface sert au typage
package itf
{
        public interface IDataSet extends IList, ICollection
        {

        }
}

// Implémentation de IDataSet
package cl
{
        import itf.IDataSet;

        public class DataSet implements IDataSet
        {
                public function getLength():int
                {
                        return -1;
                }
               
        }
}

Rien de bien gênant, mais ca peut parfois être troublant! ;)

  • Le workaround du premier problême fait surtout chuter les performances
  • Le deuxième problême par contre ne sacrifie en rien les performances, mais peut-être gênant si on ne connait pas les interfaces mères...