Un aspect singulier des interfaces face à l'héritage est que le compilateur de Flash MX 2004 ne se contente pas de vérifier si une classe implémente l'interface, mais il vérifie aussi que les méthodes devant être implémentées le sont ...

Pour etre plus clair, j'ai découvert cela en faisant des tests en réimplémentant ma bibliothèque sur les matrices. Ma classe Matrix hérite d'un classe Grid. Cette classe Grid possède une méthode clone(). J'ai voulu créer une interface IClonable pour m'assurer qu'une matrice puisse être clonée, et ayant oublié de créer la méthode, je me suis rendu compte que le compilateur laissait passer malgré tout ... :o En fait, cette méthode existe déjà dans Grid, alors que Grid n'implémente pas IClonable ! :)

Voici le code que le compilateur laisse passer :/*
 * interface IClonable
 */

interface net.lalex.interfaces.IClonable {
        public function clone():Object;
}
/*
 * classe Grid
 */

class net.lalex.data.Grid extends Array {
        // Plein de code ...
        // Retourner un clone de la grille
        public function clone():Object {
                var ret:Grid = new Grid(_gridWidth, _gridHeight);
                ret.copyFrom(this);
                return ret;
        }
        // Copy les éléments d'une autre grille
        public function copyFrom(g:Grid):Void {
                // Code
        }
}
/*
 * classe Matrix
 */

class net.lalex.maths.Matrix extends net.lalex.data.Grid implements net.lalex.interfaces.IClonable {
        // Aucune méthode 'clone()'
}

Normal allez-vous me dire ? Oui, en effet. :D Mais je ne pensais pas que le compilateur allait si loin. Ca ne m'arrange pas en fait, car j'aurais bien voulu forcer la classe Matrix à surcharger la méthode clone() ... :(