Con implement podemos implementar nuevas características y funcionalidades en las clases de Mootools, modificando la propia clase en vez de creando nuevas clases.
Continuamos el Manual de Mootools con explicaciones sobre el implement de las clases de Mootools. Implement es un método de Class, por tanto es un método que tendrá cualquier nueva clase que creemos con Mootools (Recordemos que cualquier clase creada con Mootools en realidad es un objeto de la clase Class). Implement sirve para modificar una clase creada anteriormente, añadiendo nuevas propiedades o métodos.
Para explicar el funcionamiento de implement podemos utilizar un ejemplo. Imaginemos que tenemos la clase coche. El coche puede tener color, modelo y motor, luego a un coche podemos arrancarlo y pararlo, moverlo y detenerlo. Pero ahora imaginemos que necesitamos complicar un poco la clase coche, para añadirle un número de plazas para pasajeros y la posibilidad de llenar o vaciar dichas plazas con personas. Entonces lo que haremos será implementar en la clase coche, ya creada anteriormente, la propiedad de número de plazas, así como los métodos de ocupar y desocupar los asientos.
Con implement no se crean nuevas clases, sino que se modifican. La clase coche habrá cambiado, porque ahora tiene nuevas propiedades y funcionalidades, pero no se habrá creado ninguna clase a partir de coche, sino que es la misma clase coche la que se ha alterado.
Para entender mejor implemet tenemos que verlo en comparación con extend. Mientras que con extend lo que se creaban eran nuevas clases que extendían las anteriores, con implement lo que estamos es modificando esas mismas clases. Por si no ha quedado todavía claro, con extend creábamos nuevas clases "hijo" que heredaban propiedades y métodos de clases "padre", mientras que con implement no se crea ninguna clase nueva "hijo", sino que se modifica la clase original que se está implementando.
¿Para qué casos puede servir implement?
Voy a dar un ejemplo típico en el que nos puede servir de mucha ayuda el método implement. Imaginemos que tenemos la clase "Animal". Luego con extend hemos creado, a partir de la clase animal, las clases "Mamíferos" y "Anfibios". Ahora, extendiendo la clase "Mamíferos" hemos creado la clase "Perro" y "Gato". Extendiendo "Anfibios" hemos creado la clase "Rana" y "Salamandra".
En una estructura de herencia como la que he relatado por poner un ejemplo, ahora imaginemos que queremos añadir una característica o funcionalidad específica a la clase "Animal", para que todos los animales de la jerarquía de herencia tengan esa nueva funcionalidad o característica. Podríamos extender la clase "animal" y crear un "AnimalExtendido", pero esto no modificaría las clases que heredan de "Animal", a no ser que modificásemos el código de todas las clases que dependen de "Animal" para hacer que, en vez de extender "Animal", extendiesen "AnimalExtendido".
Esa solución, que sería poco atractiva, por tener que retocar el código de una serie de clases, se puede solucionar con implement. Con Implement podríamos modificar directamente la clase "Animal" y con ello conseguiríamos que cambiase esta y todas las clases que tenga por debajo en la jerarquía de herencia. Es decir, implementando esas nuevas funcionalidades o características a "Animal" estaríamos automáticamente incorporándolas a los "Mamíferos", "Anfibios", "Perros", "Ranas"
Veamos un ejemplo de Implement en un código Javascript con Mootools:
Podemos tener una clase llamada "Casa", con un código como el que sigue:
var Casa = new Class({
abierta: false,
initialize: function(habitaciones, banos){
this.num_habitaciones = habitaciones;
this.num_banos = banos;
},
abrir: function(){
this.abierta = true;
alert('casa abierta');
},
cerrar: function(){
this.abierta = false;
alert('casa cerrada');
}
})
Esta clase "Casa" tiene una propiedad "abierta" que en principio vale "false". Además con el constructor initialize se crean dos nuevas propiedades que son el número de habitaciones y baños. Luego se han creado dos métodos uno para abrir() la casa y otro para cerrar() la misma.
Ahora vamos a ver como se podría utilizar implement para añadir nuevas propiedades y métodos.
Casa.implement({
ocupantes: 0,
ocupar: function(){
if (this.abierta){
if (this.ocupantes < this.num_habitaciones){
this.ocupantes++;
alert("He ocupado una habitación");
}else{
alert("No hay espacio para mi en la casa");
}
}else{
alert("La casa está cerrada, no puedo entrar");
}
},
desocupar: function(){
if (this.abierta){
if (this.ocupantes > 0){
this.ocupantes--;
alert("He salido de la casa y dejado una habitación libre");
}else{
alert("No hay ocupantes en la casa");
}
}else{
alert("La casa está cerrada, no puedo salir");
}
}
});
Vemos que se ha añadido una propiedad llamada "ocupantes", que contiene el número de ocupantes de la casa, inicialmente siempre igual a cero.
Luego se han añadido con implement dos métodos, ocupar() y desocupar(). El método ocupar primero comprueba si la casa está abierta y luego si queda espacio en las habitaciones. Si es así añade uno al número de ocupantes. El método desocupar() simplemente mira si la casa está abierta y si hay ocupantes y en ese caso resta uno a los ocupantes.
Después del implement, la clase "Casa" simplemente tendrá esas nuevas propiedades y métodos, pero seguirá siendo la misma clase "Casa", simplemente modificada.
Podríamos poner en marcha la clase casa de la siguiente manera:
var miCasa = new Casa(2,1);
miCasa.ocupar();
miCasa.abrir();
miCasa.desocupar();
miCasa.ocupar();
miCasa.ocupar();
miCasa.ocupar();
miCasa.desocupar();
miCasa.ocupar();
Podemos ver el ejemplo en marcha en una página aparte.
Sólo señalar un pequeño detalle, que puede ser una tontería el comentar, pero para que quede claro. En extend podíamos utilizar parent() para hacer referencia a la clase padre que estábamos extendiendo, desde la clase hija. Pero en implement, como no se está creando ninguna clase hija, sino que se modifica la clase original, no tiene sentido utilizar parent().
Para explicar el funcionamiento de implement podemos utilizar un ejemplo. Imaginemos que tenemos la clase coche. El coche puede tener color, modelo y motor, luego a un coche podemos arrancarlo y pararlo, moverlo y detenerlo. Pero ahora imaginemos que necesitamos complicar un poco la clase coche, para añadirle un número de plazas para pasajeros y la posibilidad de llenar o vaciar dichas plazas con personas. Entonces lo que haremos será implementar en la clase coche, ya creada anteriormente, la propiedad de número de plazas, así como los métodos de ocupar y desocupar los asientos.
Con implement no se crean nuevas clases, sino que se modifican. La clase coche habrá cambiado, porque ahora tiene nuevas propiedades y funcionalidades, pero no se habrá creado ninguna clase a partir de coche, sino que es la misma clase coche la que se ha alterado.
Para entender mejor implemet tenemos que verlo en comparación con extend. Mientras que con extend lo que se creaban eran nuevas clases que extendían las anteriores, con implement lo que estamos es modificando esas mismas clases. Por si no ha quedado todavía claro, con extend creábamos nuevas clases "hijo" que heredaban propiedades y métodos de clases "padre", mientras que con implement no se crea ninguna clase nueva "hijo", sino que se modifica la clase original que se está implementando.
Referencia: Tenemos explicaciones de Extend en el manual de Mootools. |
¿Para qué casos puede servir implement?
Voy a dar un ejemplo típico en el que nos puede servir de mucha ayuda el método implement. Imaginemos que tenemos la clase "Animal". Luego con extend hemos creado, a partir de la clase animal, las clases "Mamíferos" y "Anfibios". Ahora, extendiendo la clase "Mamíferos" hemos creado la clase "Perro" y "Gato". Extendiendo "Anfibios" hemos creado la clase "Rana" y "Salamandra".
En una estructura de herencia como la que he relatado por poner un ejemplo, ahora imaginemos que queremos añadir una característica o funcionalidad específica a la clase "Animal", para que todos los animales de la jerarquía de herencia tengan esa nueva funcionalidad o característica. Podríamos extender la clase "animal" y crear un "AnimalExtendido", pero esto no modificaría las clases que heredan de "Animal", a no ser que modificásemos el código de todas las clases que dependen de "Animal" para hacer que, en vez de extender "Animal", extendiesen "AnimalExtendido".
Esa solución, que sería poco atractiva, por tener que retocar el código de una serie de clases, se puede solucionar con implement. Con Implement podríamos modificar directamente la clase "Animal" y con ello conseguiríamos que cambiase esta y todas las clases que tenga por debajo en la jerarquía de herencia. Es decir, implementando esas nuevas funcionalidades o características a "Animal" estaríamos automáticamente incorporándolas a los "Mamíferos", "Anfibios", "Perros", "Ranas"
Veamos un ejemplo de Implement en un código Javascript con Mootools:
Podemos tener una clase llamada "Casa", con un código como el que sigue:
var Casa = new Class({
abierta: false,
initialize: function(habitaciones, banos){
this.num_habitaciones = habitaciones;
this.num_banos = banos;
},
abrir: function(){
this.abierta = true;
alert('casa abierta');
},
cerrar: function(){
this.abierta = false;
alert('casa cerrada');
}
})
Esta clase "Casa" tiene una propiedad "abierta" que en principio vale "false". Además con el constructor initialize se crean dos nuevas propiedades que son el número de habitaciones y baños. Luego se han creado dos métodos uno para abrir() la casa y otro para cerrar() la misma.
Ahora vamos a ver como se podría utilizar implement para añadir nuevas propiedades y métodos.
Casa.implement({
ocupantes: 0,
ocupar: function(){
if (this.abierta){
if (this.ocupantes < this.num_habitaciones){
this.ocupantes++;
alert("He ocupado una habitación");
}else{
alert("No hay espacio para mi en la casa");
}
}else{
alert("La casa está cerrada, no puedo entrar");
}
},
desocupar: function(){
if (this.abierta){
if (this.ocupantes > 0){
this.ocupantes--;
alert("He salido de la casa y dejado una habitación libre");
}else{
alert("No hay ocupantes en la casa");
}
}else{
alert("La casa está cerrada, no puedo salir");
}
}
});
Vemos que se ha añadido una propiedad llamada "ocupantes", que contiene el número de ocupantes de la casa, inicialmente siempre igual a cero.
Luego se han añadido con implement dos métodos, ocupar() y desocupar(). El método ocupar primero comprueba si la casa está abierta y luego si queda espacio en las habitaciones. Si es así añade uno al número de ocupantes. El método desocupar() simplemente mira si la casa está abierta y si hay ocupantes y en ese caso resta uno a los ocupantes.
Después del implement, la clase "Casa" simplemente tendrá esas nuevas propiedades y métodos, pero seguirá siendo la misma clase "Casa", simplemente modificada.
Podríamos poner en marcha la clase casa de la siguiente manera:
var miCasa = new Casa(2,1);
miCasa.ocupar();
miCasa.abrir();
miCasa.desocupar();
miCasa.ocupar();
miCasa.ocupar();
miCasa.ocupar();
miCasa.desocupar();
miCasa.ocupar();
Podemos ver el ejemplo en marcha en una página aparte.
Sólo señalar un pequeño detalle, que puede ser una tontería el comentar, pero para que quede claro. En extend podíamos utilizar parent() para hacer referencia a la clase padre que estábamos extendiendo, desde la clase hija. Pero en implement, como no se está creando ninguna clase hija, sino que se modifica la clase original, no tiene sentido utilizar parent().
Miguel Angel Alvarez
Fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Com...