2.I. Concepto de Clase. Clases en ActionScript 3

Esta entrada pertenece a ActionScript 3 - Guía para Principiantes.


Concepto de clase. Clases en ActionScript 3


Un mundo lleno de objetos...

Si conoces los conceptos de programación de objetos, puedes saltarte estos puntos hasta llegar a la última parte del capítulo.


Son muchos y variados los tipos de programación que existen actualmente. Programación estrucuturada, orientada a objetos, lógica, funcional... Cada una con sus pros y sus contras y un sistema propio de funcionaminento.


El principio básico de la Programación Orientada a Objetos es que todo aquello que necesitamos para representar nuestros programas son objetos. Y si lo piensas, razón no le falta. En nuestro Pong vamos a necesitar diferentes objetos para jugar: una bola, los Pong contra las que va a rebotar la bola, unos marcadores para llevar la puntuación... Todos ellos objetos.


(Anotación informática carente de interés: Bueno, siendo estrictos, no todo en la POO son objetos estrictamente... Debate intenso a la vez que inútil que mantienen defensores de la programación funcional pura frente a los que defienden la orientación a objetos...)


Es obvio que no todos los objetos son iguales. Un jarrón no es lo mismo que una pelota, pero un jarrón verde tampoco es exactamente igual a un jarrón rojo. Aquí es dónde interviene, por fin, el concepto de clase.


Concepto de Clase

Vamos a pasar un poco rápido sobre la teoría, porque cuándo realicemos el ejemplo en ActionScript se verá mucho más claro.


En POO, una clase es un tipo de objeto. Todas las pelotas del mundo pertenecen a la clase pelota, y todos los jarrones del mundo a la clase jarrón. Además, cada tipo de objeto tiene unas acciones asociadas (métodos) y unas características propias (atributos).


¿Qué es un atributo?

Un atributo es una característica del tipo de objeto.


En el caso del jarrón, posibles atributos serían: color (así podemos distinguar el jarrón rojo del verde), volumen, contenido...


Y en el caso de la pelota: tamaño, velocidad, dirección...


¿Qué es un método?

Un método es una acción que el tipo de objeto puede realizar.


Para el jarrón, posibles métodos serían: rellenar, romper...


Para la pelota: golpear, parar, pinchar...


¿Cuál es la diferencia entre Clase y Objeto?

Una objeto es una instanciación de una clase. En cristiano, cuándo Dios creó el mundo, lo primero que se hizo fue un molde con forma humana. Ese molde era la clase. La clase humano. Y cuándo creó a Adán utilizando ese molde, creó un objeto de la clase humano. Adán es el objeto, humano la clase. Adán lo concreto, humano lo abstracto.


Clases en ActionScript 3

Vamos a crear nuestra primera (segunda, si contamos el Main.as) clase en ActionScript. Y para empezar, vamos a pensar en uno de los tipos de objeto que vamos a necesitar para nuestro Pong: efectivamente, un Pong. La barrita-mini-pared que subirá y bájara evitando que la pelota sobrepase los límites de nuestro campo.


Con el proyecto Pong abierto en FlashDevelop, vamos a crear unas carpetas para organizar nuestro trabajo mejor: click derecho sobre la raíz del proyecto Pong (AS3) -> Add -> New Folder... y lo llamos "mi", y sobre esta nueva carpeta, misma operación y añadimos una subcarpeta llamada "pong". Y sobre esta carpeta, misma operación, pero en vez de New Folder seleccionamos New Class y la llamamos Pong.as.


Por convención, los nombres de las clases se escriben con mayúsculas, mientras que los de las carpetas (paquetes) con minúscula. Ahora ya es un buen momento para explicar el código que aparece.


package mi.pong
{

/**
* ...
* @author ASL
*/
public class Pong
{

public function Pong()
{

}

}

}

- package mi.pong: Es el paquete (jerarquía de carpetas) en el que se encuentra la clase alojada (el archivo .as). Es decir, dentro de la carpeta "mi", en la carpeta "pong". Es importante que el package esté bien especificado para evitar problemas en la compilación.


- public class Pong: Definición de la clase Pong.


- public function Pong(): Constructor de la clase Pong.


Ya han aparecido bastantes cosas nuevas, así que sinteticemos:


Definición de paquetes

package carpeta_raiz.subcarpeta1.subcarpeta2.(...)
{
// Definición de clases del paquete
}

Definición de clases

public class MiClase
{
// Lista de atributos

public function MiClase()
{
// Definición del constructor
}

// Lista de métodos
}

¿Y el public qué significa? De momento quédate con la idea de que todo aquello que sea public puede ser referenciado por otros archivos .as.


Añadiendo atributos y métodos a nuestra clase Pong

Sin más, añadamos caracterísiticas a nuestra clase Pong para convertirla en una clase útil. ¿Qué atributos y métodos podemos añadir a nuestro pong?


- Velocidad: atributo para predecir su localización. Además, el pong sólo se mueve verticalmente, así que sólo necesitaremos saber la velocidad en el eje de la y.


-Mover: método para poder desplazar el Pong por la pantalla.


Definición de variables

var nombre_variable:tipo_variable [= valor_inicial];

Los atributos son variables que tienen una visbilidad especificada y que se declaran en el cuerpo de la clase, fuera de todo tipo de función.


Visibilidad de atributos y funciones


Los tres tipos de visibilidad para atributos y funciones son:


- public: Cualquier clase externa puede acceder a ellos.


- private: Sólo clases internas pueden acceder a ella.


- protected: Sólo clases hijas pueden acceder a ellas. Las clases hijas se explicarán más adelante.


Definición de atributos

visibilidad var nombre_atributo:tipo_atributo [= valor_inicial];

Definición de funciones

visibilidad function nombre_atributo([parámteros...]):tipo_devolución
{
// Cuerpo de la función
}

El constructor de la clase

Consideramos el constructor de clase a aquella función que tiene el mismo nombre que la clase. Cuándo creemos un objeto, el constructor de clase será la primera función en ejecutarse.


Pues ahora que sabemos todo esto, vamos a añadir a nuestra clase Pong el atributo velocidad y el método mover.


package mi.pong
{

/**
* ...
* @author ASL
*/
public class Pong
{
private var vy:Number;

public function Pong()
{
trace("¡Objeto de la clase Pong creado!");
}

public function mover():void
{
// Vacío. Aún no sabemos cómo vamos a mover nuestro Pong
}

}

}

- private var vy:int : Especifica que el atributo "vy" es del tipo entero (un número redondo negativo o positivo) y además privado. Sólo puede ser visto dentro de la clase Pong.


- public function mover():void : Una función pública llamada mover; void es un tipo especial, que indica que la función no devuelve nada.


Creando un objeto de la clase Pong

Cómo habrás notado, hemos añadido un trace("¡Objeto de la clase pong creado!"); en el constructor de clase. Este mensaje nos servirá para constatar (a falta aún de una representación gráfica para el pong) que el objeto ha sido creado.


Abrimos Main.as y modificamos el código que teníamos por lo siguiente:


package
{
import flash.display.MovieClip;
import mi.pong.Pong;

/**
* ...
* @author ASL
*/
public class Main extends MovieClip
{

public function Main()
{
var miPong:Pong = new Pong();
}

}

}

- import mi.pong.Pong: Si queremos crear un objeto de tipo de Pong, lo primero que hemos de hacer es importar la clase, especificando delante del nombre el paquete en el que está. Si no la importáramos, obtendríamos un error.


- var miPong:Pong = new Pong(): new seguido de un constructor nos devuelve un objeto de la clase especificada. Ese objeto se almacena en la variable miPong, que ha sido especificado del tipo Pong. Observa que esto es una variable dentro la función, no un atributo de la clase, y que por eso no se especifica ninguna visibilidad.


Ctrl+Enter para probar la película, F2 para ver la salida y ahí estará la prueba viviente de que creamos nuestro objeto de la clase Pong. Algo soso, sí. En el siguiente capítulo mostaremos nuestro pong dentro de la ventana Flash.








Anterior Índice Siguiente