Muy sencillo, direis: crÈalo en el prototipo de movieclip. Pero, øquÈ sucede cuando estamos escribiendo AS 2.0?
Ahora no podemos modificar la clase MovieClip, sino que sÛlo podemos extenderla, y aÒadir nuevos mÈtodos a esas clases hijas. øSeguro?. Veamos:
La teorÌa sobre programaciÛn orientada a objetos es que si queremos aÒadir alg˙n mÈtodo a la clase movieclip, lo que debemos hacer es:
class net.designnation.exp.Mezcla extends MovieClip{
function Mezcla(){
trace("constructor de mezcla");
}
//Este es el mÈtodo que queremos que
// tengan todos los movieclips
private function metodoAS1(){
trace("este es el mÈtodo particular");
}
}
Bien, esto nos permite hacer que la clase Mezcla tenga todos los mÈtodos heredados de MovieClip, y adem·s el mÈtodo metodoAS1. Pero ese mÈtodo AS1 pertenece a la clase Mezcla, y sÛlo a ella. Es decir, que si cre·ramos otra clase que extendiera de movieclip, si queremos que tenga el mÈtodo metodoAS1, deberÌamos definirle.
De todas formas, algunos ya habreis pensado: distintas clases con el mismo mÈtodo.... øinterfaces?. Efectivamente, podemos implementar un interface:
interface net.designnation.exp.MCInterface{
public function metodoAS1():Void;
}
Y hacer que nuestras clases lo implementen:
import net.designnation.exp.*;
class net.designnation.exp.Mezcla extends MovieClip
implements MCInterface{
function Mezcla(){
trace("constructor de mezcla");
}
//Este es el mÈtodo que forma parte del interfaz.
//debemos definirlo aquÌ!!!
private function metodoAS1(){
trace("Èste es el mÈtodo particular");
}
}
øEst· nuestro problema solucionado?. No del todo. El hacer que una clase implemente un interfaz sÛlo sirve para que el compilador nos dÈ un error si esa clase no tiene implementados todos los mÈtodos del interfaz. Dicho de otra manera, el hacer que una clas implemente un interfaz, nos sirve sÛlo para asegurarnos que esa clase implementa una serie de mÈtodos, que hemos enumerado en otro lugar (el interfaz).
Pero esos mÈtodos debemos implementarlos en todas y cada una de las clases que implementen el interfaz, con lo que tampoco conseguimos lo que queremos, que por si alguien se ha perdido (y yo estoy a punto) no es m·s que definir una sola vez un mÈtodo, y que ese mÈtodo sea accesible a MovieClip y a todas sus subclases.
Probablemente la soluciÛn m·s estricta y elegante serÌa hacer una clase que heredara de movieclip, con el mÈtodo que queremos implementar definido en ella, y hacer que el resto de clases hereden de esa clase, en vez de hacerlas heredar de movieclip.
Pero si por algo nos caracterizamos los programadores (o desarrolladores, o scripters o lo que seamos) que trabajamos con actionscript es por que no nos gustan demasiado las soluciones estrictas y elegantes. Para eso ya hay gente que sabe muchÌsimo Java.
Por lo tanto, vamos a lo que nos gusta de verdad.
Recordemos la ìviejaî forma de definir un mÈtodo com˙n a todas las instancias de una clase:
MovieClip.prototype.metodoAS1 = function(){
trace("Bien!. Se ha ejecutado el mÈtodo AS1");
};
Si escribimos ese cÛdigo en el primer frame de nuestro fla, antes de cualquier otra cosa, todas las instancias de MovieClip tendr·n implementado ese mÈtodo.
øPero quÈ pasa con nuestra clase?. Veamos: nuestra clase hereda de MovieClip, luego:
class net.designnation.exp.Mezcla extends MovieClip{
function Mezcla(){
trace("constructor de la clase Mezcla");
}
private function metodoAS2(){
trace("Y yo soy el mÈtodo AS2");
};
public function onRollOver(){
//Ejecuto el mÈtodo metodoAS1 de la superclase.
super.metodoAS1();
metodoAS2();
};
}
Para ilustrar el ejemplo, vamos a crear un movieclip, que utilizaremos como botÛn. Dentro de ese clip, hay que dibujar una forma cualquiera, porque lo que queremos es asignarle a la clase anterior, y ver quÈ pasa cuando hacemos rollOver sobre Èl.
Una vez creado el movieclip, en sus propiedades de vinculaciÛn, asignamos como Indentificador ìMiClipî y como Clase de AS 2.0 ìnet.designnation.exp.Mezclaî
Por tanto, el cÛdigo del primer frame de nuestro fla queda de la siguiente manera:
MovieClip.prototype.metodoAS1 = function(){
trace("Bien!. Se ha ejecutado el mÈtodo AS1");
};
//Al hacer attachmovie, se instanciar· la clase Mezcla
this.attachMovie("MiClip", "instancia", 1);
øQuÈ pasa al hacer rollover sobre el clip?. Premio!. Se ejecuta el mÈtodo que definimos en el prototype de MovieClip. Pero, ese mÈtodo reside en la superclase de la clase Mezcla, luego øcÛmo podemos ejecutar desde ese mÈtodo otros mÈtodos de la clase Mezcla?
Modifiquemos un poco los mÈtodos metodoAS2 y onRollOver de Mezcla
private function metodoAS2(arg){
trace("Y yo soy el mÈtodo AS2 " + arg);
};
public function onRollOver(){
super.metodoAS1(this);
};
TambiÈn la definiciÛn de metodoAS1 en el prototype de MovieClip:
MovieClip.prototype.metodoAS1 = function(ref){
trace("Bien!. MÈtodo AS1" + this.constante);
ref.metodoAS2("x " + this._width);
};
øQuÈ hemos hecho?. Pues desde la clase Mezcla llamamos al mÈtodo de su superclase, pas·ndole una referencia a la clase desde la que dicho mÈtodo ha sido llamado. Por tanto, ahora, la superclase sabe quÈ clase la ha llamado, y puede saber a quiÈn debe contestar.
øA alguien le han quedado ganas de hacer alg˙n comentario?