Héritage de TextField
Par Cédric Tabin le vendredi 29.08.2008, 10:50 - ActionScript - Lien permanent
En lisant la mailing-list de flashcoders, je suisfr tombé sur une question intéressante concernant l'héritage de la classe TextField en AS1 et AS2. Petit retour en terre de prototypage...
Pour créer une classe en AS1, voici un petit exemple :
_global.PersoField = function() { } //constructeur PersoField.prototype.sayHello = function() { trace("Hello"); } //une méthode
Que l'on utilise comme toujours :
var pf = new PersoField(); pf.sayHello(); //Hello
Maintenant le niveau de difficulté augmente. Il faut faire hériter cette classe de TextField. Pour cela, il existe la propriété __proto__ qui sert justement à définir la chaîne d'héritage !
_global.PersoField = function() { } PersoField.prototype.sayHello = function() { trace("Hello"); } PersoField.prototype.__proto__ = TextField.prototype; //héritage de TextField
Lorsqu'une méthode est appelée sur une instance de la classe PersoField et que celle-ci n'est pas trouvée, le player va utiliser cette propriété pour remonter dans la chaîne d'héritage pour voir si elle n'existe pas dans une classe parente et ainsi de suite.
Il reste encore le problème de l'utilisation... La méthode createTextField en AS1 et AS2 renvoie une instance de TextField et non pas de PersoField ! C'est là que la magie du prototypage intervient : grâce à la propriété __proto__ il est possible de 'spécifier' la classe d'un objet :
var field = this.createTextField("field", 1, 10,10,250,250); field.__proto__ = PersoField.prototype; //spécialisation field.sayHello(); //Hello
Au final, pour avoir un peu plus de facilité d'utilisation, il suffit d'encapsuler tout cela dans une méthode statique :
_global.PersoField = function() { } PersoField.prototype.sayHello = function() { this.text = "Hello"; } //méthode statique (pas de 'prototype') PersoField.createTextField = function(container, name, depth, x, y, with, height) { var field = container.createTextField(name, depth, x, y, width, height); field.__proto__ = PersoField.prototype; return field; }
Il ne reste plus qu'a utiliser :
var field = PersoField.createTextField(this, "field", 0, 0, 200, 10); field.sayHello(); //le champs de texte affichera Hello
En bref, c'est bien plus simple et pratique en AS3 ! A noter que j'ai tiré cette article de ce thread et que c'est Ekameleon qui apporte la solution !
Commentaires
Hello
Tiens en lisant le titre de ton post sur le feeds d'adobe j'ai eu comme une impression de déjà vu
En effet le __proto__ (ou constructor.prototype) c'est le top Et même si en AS3 c'est plus simple d'hériter de TextField ou autre.. le __proto__ c'était tout de même le top pour changer la nature d'un objet dynamiquement au runtime.
Sinon pour les outils pour gérer ce genre de manipulation sur les éléments graphique tu peux regarder ma classe AS2 DisplayFactory qui résume bien tout ce qui est au dessus dans ton article
http://vegas.googlecode.com/svn/AS2...
PS : dans ton exemple au dessus tu ne parles pas d'invoquer le constructeur, ex: PersoField.apply( field , args:Array )
EKA+
http://vegas.googlecode.com/svn/AS2...
Salut Eka
Effectivement j'ai zappé l'appel du constructeur ^^ Merci pour le rappel !
@++
Quel courage pour oser se replonger dans de l'AS1 après avoir connu l'AS3.
Je t'admire TheCaptain !!
Hello
Cela reste indispensable quand on continue à faire du SSAS pour FMS
EKA+