Les interfaces, c'est bien joli, mais il faut bien avouer que les classes virtuelles sont quand-même bien pratiques ... Pour ceux qui ne connaissent pas, il s'agit en fait d'un mélange entre les classes et les interfaces : on ne peut pas créer d'instance d'une classe virtuelle, mais elle contient du code, et pas uniquement les signatures des méthodes comme les interfaces...

Pour pouvoir les implémenter, il y a deux solutions

  • Créer une classe normale, et faire confiance au programmeur pour ne pas l'instancier ... (je vous dis tout de suite : c'est la mauvaise solution :D)
  • Créer une classe avec un constructeur privé (private). Le seul problème est que la classe peut être instanciée quand même grace à une petite astuce qui permet l'instanciation dynamique.

Voici un exemple de classe virtuelle en AS2 :
class VirtualClass {
private var _p:Number;

// Constructeur privé
private function VirtualClass (p:Number) {
_p = p;
}

public function myMethod() {
return _p;
}
}

class FinalClass extends VirtualClass {
// Constructeur public faisant appel au constructeur
// de la super classe.
public function FinalClass(p:Number) {
super(p);
}
}

// Fonctionne trés bien
myFinal = new FinalClass(10);
trace(myFinal.myMethod());

// Erreur à la compilation
myVirtual = new VirtualClass(10);

// Astuce pour instancier la classe virtuelle
myVirtual = new _global["VirtualClass"](10);
trace(myVirtual.myMethod());

L'astuce vient du fait que le compilateur ne peut pas détecter quelle est la classe qui va être instanciée quand on utilise la notation entre crochets, car la valeur entre les crochets peut être dynamique (le contenu d'une variable par exemple), et donc ne sait pas que le constructeur est privé. Car le compilateur n'est en fait qu'un traductauer en code AS1, qui contient des points de blocage si on essaie d'accéder à une propriété ou méthode privée ...