5. POO (Programación Orientada a Objetos)

5.1. ¿Que son los objetos?

As es un lenguaje orientado a objetos basado en ECMAScript.

Un objeto es una entidad de nuestra película, que en función del tipo del mismo, se compondrá:

. Propiedades. Son las que lo definen.

.Atributos. Determinan su estado.

.Métodos. Caracterizan su comportamiento.

IMPORTANTE!!. Una clase es un tipo definido que describe los atributos y los métodos de los objetos que se creen a partir de ella.

Los objetos creados a partir de una clase, los llamaremos instancias, y una vez instanciados, podemos cambiar, modificar y asignar los atributos que le correspondan.

5.2. Introducción a Objetos

OBJETO COCHE

  • ATRIBUTOS: Color, num ruedas, num plazas, potencia, marca
  • MÉTODOS: Arrancar, frenar, acelerar, …

OBJETO MOVIECLIP

  • ATRIBUTOS: X, y, width, height,…
  • MÉTODOS: gotoAndPlay(), gotoAndStop(), …

5.3. Definiendo clases

Se definen en ficheros externos a la película, y tienen extensión “as”.

Podemos crear ficheros.as desde flash: Nuevo->Fichero ActionScript

Ejercicio 5.3.

5.3.1. Declaración de las clases

Usamos la palabra reservada “class” (hablaremos de Package mas adelante…)

nombre_clase == nombre_fichero

class Saludo = Saludo.as

Según el libro, las clases empiezan siempre por máyuscula… Creo que es importante saber que como vimos en capítulos anteriores, tenemos varias opciones para declarar variables: Nombre descriptivo, Camel Casting, Pascal Casting, … Pues simplemente los desarrolladores de flash han usado esta norma, pero cuando creamos nuestras propias clases podremos ponerlas tanto en mínusculas como en mayúsculas.

A nivel personal, mi recomendación a la hora de declarar las variables, funciones, classes…, sería este:

class_saludo Se entiende que es una clase para la aplicación saludo
bt_saludo Botón que interactua dentro de la aplicación saludo
fn_saludo Función que usamos para en la apllicación
clip_saludo MovieClip que usamos en la aplicación

5.3.2. Declaración de atributos

Practicamente igual que las variables, con la salvedad que le podemos asignar el valor.

var loquesea:tipoquesea = new tipoquesea(valor);

5.3.3 Constructor

Es una función especial de una clase que permite inicializar objetos. Siempre que instanciemos una clase, se ejecutará el constructor de este.

Nota: Tenga o no parámetros, no usará la palabra reservda :void.

package {
public class Persona {
//Atributos
public var textoSaludo:String=new String();
//Constructor
public function Saludo () {


}
}
}

El constructor es opcional, pero si asigamos una clase a la película desde propiedaes, sino existe este, dará error.

5.3.4. Métodos

Tareas o acciones que puede llevar a cabo una instancia de una clase:

objeto=clase;

package { public class Saludo {
//Atributos
public var textosaludo:String = “hola”;
//Constructor

public function Saludo() {}
//Método
public function saludar():void { trace(textosaludo)}
}

5.3.5 Instanciación

Para poder usar una clase, esta la tendremos que alojar en la misma carpeta donde se encuentra la película.

El primer día al tratar de explicaros esto, lo hice mal, puesto que entendisteis que hablaba de usar la película en Web, pero yo me refería simplemente a la hora de trabajar=desarrollar aplicación.

Ejemplo:

La carpeta saludo, contendrá el fichero de clase “Saludo.as” y el fichero de flash “Saludo.fla”

Luego ya en la película, en el primer fotograma de la película escribiremos:

var miSaludo:Saludo = new Saludo();
miSaludo.saludar();

Ejercicio 3.5.5

5.4. Classpaths

Directorio de clases para flash.

5.4.1. Classpath Global

1 Sería la carpeta donde tenemos el documento “.fla”

2 Depende de la instalación de flash, pero si la hacemos en español por defecto:

c:Archivos de ProgramaAdobeAdobeFlashCS3esFirst RunClasses

5.4.2 Classpath realtivo al documento

Se definen desde :

Archivo->Conf.Publicación->Flash

root_proyecto->
file1.fla, file2.fla, …, fileN.fla
carpeta: misclasses->efectos->efecto1.as
->efecto2.as
->herramientas->herram1.as
->herram2.as
5.5 Uso de packages

las clases se pueden agrupar y ordenar en paquetes. Esto ayuda a evitar conflictos de duplicación de nombres de variables y métodos.

Para importar mis clases:

import misclasses.efectos.efecto1;
import misclasses.efectos.efecto2;

//Eso equivale a cargar las dos clases anteriores
import misclasses.efectos.*;

para definir las clases, solo cambiaría la llamada del package:

package misclasses.efectos { … }

5.6 Getters y Setters

Nos permiten modificar los atributos de un objeto, y brindan un punto de control en la lectura y escritura de los valores de atributos del mismo.

Estos tienen el valor añadido, que aparte de modificar los atributos también nos permiten ejecutar acciones.

Ejercicios 5.6.

5.7 Modificadores de control de acceso para miembros de clase

public. Accesible desde cualquier clase.

internal. Otras clases definidas dentro del paquete de datos.

protected. Dentro de su clase o de sus subclases.

private. Solo permite el uso de este detnro de la propia clase que lo define.

NOTA!!: Sino se declara el tipo por defecto sería del tipo Internal

Recomendación: Hasta que no controleis bien el lenguaje, os recomiendo SIEMPRE usar Public, para evitar atascos durante el desarrollo de la aplicación.

5.8. Métodos y propieades estáticas

Static. Se puede usar tanto en las propiedades como en los métodos. Solo se pueden ser accedidas directamente através de la clase sin necesidad de instanciarla.

NOTA: con Static no se puede usar “this”, ya que esta implica un ambito de instancia, y Static solo están definidos en el ámbito de clase.

Ejemplo para una propiedad Static:

package {

public class Persona {
static public var numPersonas:int = 0;
public var nombre:String;
public function Persona (nombre:String) {
this.nombre =nombre;
numPersonas++;
trace(“nueva persona:”, nombre);
}
}
}

Ejemplo 5.8.

5.9. Herencia

En POO (programación orientada a objetos), puede ampliar o extender la funcionalidad de otra clase, asi como alterar su comportamiento por defecto en situaciones determinadas.

Clase A //Supervclase
Clase B //Sub clase
Clase C //Sub clase

NOTA: Una superlcclase puede tener varias sub clases, pero una subclase solo puede tener una superclase.

Class A { … }

Class B extends Class A

En el ejemplo del libro (Pág. 81 y 82):

instanciaB.metodo()

Primero mira en la clase B, y “sino” existe busca en la clase A. Con los atributos hace lo mismo.

Un MovieClip:

MovieClip->Sprite->DisplayObjectContainers->InteractiveObjects->DisplayObject->EventDispatcher->Object

NOTA!: SI una clase no extiende a otra , hereda la super clase object. Los miembos “Static” solo tienen ámbito en la clase, y no se heredan.

5.10. Sobrescribiendo métodos

Usamos la sentencia: “override“, y con ella conseguimos pisar métodos de la superclase.

Con “super.metodo” evocaríamos el método orignal de la superclase.

Si lo suamos en el constructor de la clase B (subclase), llama al constructor de la super clase.

5.12. Poliformismo

Permite a una instancia, operar como si fuera una de sus superclases.

Ejemplo: MovieClip->hereda de displayObject -> x, y, scaleX, scaleY, width, height

Es decir, podemos usar una sub-clase: MovieClip, como si fuera una superclase.