No es un bug, es una característica no documentada

sábado, 21 de marzo de 2015

Programación. Interacción entre clases

20:55 Posted by Inazio , No comments

La dependencia 

En el tema anterior vimos cómo escribir una clase, crear y utilizer objetos de ella y cómo agruparlas en paquetes. Ahora vamos a estudiar las principals formas de interacción que se dan entre clases.

La dependencia es la forma de interacción más pobre semánticamente, ya que relaciona dos clases por el simple hecho de que una utiliza a otra.

La hemos estado utilizando cada vez que usábamos una clase para probar a otra.

PruebaBombilla está usando Bombilla.

La clase PruebaBombilla usa a / depende de Bombilla.

Si cambiamos Bombilla habrá que revisar PruebaBombilla par aver si le han afectado los cambios y también hay que modificarla.

La asociación

La asociación expresas una colaboración entre dos o más clases.


Ejemplo y notación UML


Es propietario de

Multiplicidad de una asociación

Es una restricción que nos indica el número mínimo y máximo de objetos que puede existir de una clase para una instancia de la otra.


Puede expresarse con:
è Un número fijo: 1, 12, …
è Un rango: 0..2, 2..4, 0..* (de 0 a n ocurrencias)
è Un asterisco sólo es lo mismo que el rango 0..*

Grado de una asociación

Es el número de clases que intervienen en la asociación. Tipos:
è Con grado 1 o unaria (también llamadas reflexivas)
è Con grado 2 o binarias (son las más usuales)
è Con grado 3 o ternarias
è Con grado n o n-arias


Implementación en Java de una asociación


Si una clase está asociada con otra que le presta un servicio, la primera necesita una referencia a la segunda para poder demandarle el servicio.

La idea consiste en añadir una propiedad que sea una referencia al objeto que presta los servicios.

Ejemplo


public class MandoDistancia{
   // Propiedades
   private Televisor tv;
  
   // Constructor
   public MandoDistancia(Televisor tele){
     tv = tele;
   }

   // Comportamientos
   public void encenderTelevisor(){
     tv.encender();
   }
   public void apagarTelevisor(){
     tv.apagar();
   }
   public void cambiarCanalTelevisor(int nuevoCanal){
     tv.seleccionarCanal(nuevoCanal);
   }
   …
}

En nuestro ejemplo un objeto de la clase MandoDistancia puede utilizer a otro de la clase Televisor, pero no a la inversa (el televisor “no conoce” su mando a distancia).

En el caso de que la navegabilidad sea en ambas direcciones, el triángulo se omite y se añaden referencias en las dos clases.

Ejemplo: Una persna puede tener o ninguno o como máximo un coche, puede o no puede pertenecer, como máximo, a una persona.


Si ahora suponemos que una Persona puede ser propietario de 0 a N coches necesitamos poder guarder varias referencias a obetos.

Lo podemos resolver con una tabla de referencias.

Las tablas en Java

Son objetos, esto implica que:
è Debemos declarer una referencia capaz de apuntar a un objeto tipo table
è Debemos crear el objeto con el operador new

Ejemplo:

// Declaraciones de referencias a tablas
int edades[];
String diasSemana[];
Coche cochesEnPropiedad[];

// Creación de los objoetos de tipo table
edades = new int[20];
diasSemana = new String[7];
cochesEnPropiedad = new Coche[10];

// Declaraciones y creaciones en una sola línea
int edades[] = new int[20];
String diasSemana[] = new String[7];
Coche cochesEnPropiedad[] = new Coche[10];

// Declaración, creación e inicialización en una sóla línea
int edades[] = {12, 15, 18, 10, 20, 80, 17};
String laborales[] = {“lunes”, “martes”, “miercoles”, “jueves”, “viernes”, “sabado”, “domingo”};

Al crear un objeto de tipo tabla todos sus elementos se inicializan automáticamente a los siguientes valores por defecto:

Tipos primitivos
è Números y char a 0
è Lógicos a false
Tipos referencia a objeto
è A null;

El acceso a los elementos se realiza mediante indices que comienzan en cero. Ejemplo

edades[5] = 30;
semana[0] = new String(“Domingo”);
if (edades[0] >= 18)…

Las tablas mantienen fijo su tamaño una vez son creadas.

La propiedad public length nos indica el tamaño de la table. Es muy cómodo usarla para los bucles.

for (i=0;i<semana.length;i++)
   System.out.println(“Día ”+i+” = “+semana[i]);

Si accedemos a una table con un índice fuera de los límites de ésta, la máquina virtual Java se da cuenta y lanza una excepción en tiempo de ejecución (se trata en el tema siguiente).

Las asociaciones todo / parte

Son un tipo de asociación de clases entre las que existen una relación estructural, los objetos de una clase forman parte de los objetos de la otra (todo).

Se divide en dos tipos:
è Composición. En la que los objetos parte sólo existen si exite el todo y sólo se pueden accede a través de éste. La notación en UML es:


Ejemplo



è Agregación. En la que los objetos parte pueden existir sin que exista el todo y no necesita a éste para ser accedidos. Es menos restrictiva que la anterior. La notación en UML es


Ejemplo


Una empresa posee artículos para fiestas (barras, tiradores, equipos de sonido…)

Una caseta de feria alquila dicho material.

Durante la ferie de objetos Articulo forma parte del todo que es la caseta.

Cuando la feria acaba el objeto caseta desaparece, sin embargo los objetos Articulo siguen existiendo y estando disponible para ser alquilados por otros clientes de la empresa de festejos.

La herencia

Concepto y notación UML

La herencia, en biología, se define como el conjunto de carácteres que los seres vivos reciben de sus progenitors.

En orientación a objetos la herencia es una forma de relacionarse entre dos clases en la que una (subclase o clase hija) recibe parte de las propiedades y métodos de otra (superclase o clase padre).

Es un potente mecanismo de reutilización de código propio de la orientación a objetos.

Notación UML


Usamos la herencia cuando tenemos clases  que:
è Guardan una relación “es un”
è Se relacionan de manera que una generalice el funcionamiento de otras
è Una clase sea una espacialización de otra

Si partimos de la clase Felino, entonces un Tigre es un Felino: especialización.
Pero también podríamos decir que un Felino es un Mamífero, en cuyo caso estaríamos ante una generalización.


Atributo protegido: Con #
Que se puede heredar.

De esta forma podemos crear una jerarquía como:
(siguiente página)


Así las propiedades de Gato serían: peso, alimentación, diasSinCazar, y los métodos serán: nace, crece, reproduce, muere, salta, caza, maulla.

Implementación en Java

Para que una clase Hija herede de otra clase Padre hay que añadir la cláusula extends en la definición de la clase.

public class Hija extends Padre{
   //no hace falta volver a definer las propiedades y métodos de la clase Padre
}

Se dice que la clase Hija extiende a la Padre.

Java no permite la herencia multiple. No podemos hacer public class A extends B,C{…}

Con la herencia aparece un nuevo modificador de la visibilidad de una clase: protected

Si un atributo o método de una superclase es declarado como protected entonces sera heredado por las subclases, sin embargo no será accessible por el resto de las clases.

Se comporta como public para las subclases y como private para las clases que no pertenecen a la descendencia.

¿Qué miembros se heredan?


0 comentarios:

Publicar un comentario