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