Publicado el 17 de Enero del 2019
402 visualizaciones desde el 17 de Enero del 2019
2,8 MB
37 paginas
Programación
Tema 7: Relaciones entre clases
Programación DIT-UPM
1
Contenidos
l Polimorfismo
l Implementación de interfaces
l Uso de interfaces
l Jerarquías de interfaces
l Extensión
l Jerarquía de extensión
Programación DIT-UPM
2
Polimorfismo
l Polimorfismo: elementos parecidos pero distintos se
usan de igual forma
n Clases que tienen métodos públicos con la misma cabecera
n Sus objetos se pueden manejar con la misma referencia
n El compilador comprueba que la cabecera a la que se llama es
n Durante la ejecución se llama al método de acuerdo al tipo
válida
real del objeto
l El uso del polimorfismo permite
n Separación código genérico-abstracto del específico-detalles
n Reducción de la cantidad de código
n Sustitución de las clases que contienen los detalles
n Añadido de nuevas clases con detalles diferentes
Programación DIT-UPM
3
Elementos del polimorfismo
n método que hace algo
l Servicio
l Servidor
servicios
l Interfaz
n clase que da el servicio; define el método, implementa los
n especificación del servicio pero no da el servicio
n cabecera del método de servicio
l Cliente
n clase que usa los servicios de otra u otras clases sin saber la
clase real del objeto
Programación DIT-UPM
4
Clase interfaz
l Contiene las signaturas de los métodos comunes que
definen un servicio
l Especificación: clase vacía, no puede contener
n Ni atributos
n Ni constructor
l Clase incompleta (abstracta) que sólo contiene
n cabeceras de métodos públicos (no estáticos)
n constantes
l Una interfaz es un tipo
n se pueden declarar referencias
n Que podrán apuntar a objetos de cualquier clase que implemente a
la interfaz
l Una clase puede implementar varios interfaces
n Si no da cuerpo a todos los métodos: clase abstracta-incompleta
5
Programación DIT-UPM
Implementación de la
interfaz
l Es aquella clase “normal” que hace todo lo que prometía
la interface, da el servicio:
n Debe implementar todos los métodos de la interfaz
¡ Cabeceras iguales
¡ Puede añadir excepciones
n En la interfaz no se indica quién la implementa
n En la clase sí se indica a quién se implementa
¡ class TelefonoMovil implements Ubicado {}
l Se pueden implementar varias interfaces a la vez
Programación DIT-UPM
6
Ejemplos
interface Coordenada {
double getX ();
double getY ();
double distancia (Coordenada q);
}
class Cartesiana
implements Coordenada {
class Polar
implements Coordenada {
private double x, y;
Cartesiana (double x,double y) {
this.x=x; this.y=y;
}
double getX () { return x; }
double getY () { return y; }
double distancia (Coordenada q){
double dx=q.getX()-this.getX();
double dy=q.getY()-this.getY();;
return Math.sqrt(dx*dx+dy*dy);
}
}
Programación DIT-UPM
private double r, a;
Cartesiana (double m,double a) {
this.r=r; this.a=a;
}
double getX() { return r*Math.cos(a); }
double getY() { return r*Math.sin(a); }
double distancia (Coordenada q){
double dx=q.getX()-this.getX();;
double dy=q.getY()-this.getY();;
return Math.sqrt(dx*dx+dy*dy);
}
}
7
Implementación de interfaz
Relación de uso
<<Interface>>
Ubicado
getPosicion() : Punto
*
CalculoCobertura
elementos : Ubicado
distanciaAlOrigen() : double
Relación de
implementación
“es-un”
interface Ubicado {
public Punto getPosicion ( );
}
class TelefonoMovil implements Ubicado {
public Punto getPosicion ( ) {
Localizador l = new Localizador ( );
...
return l.getCentro ( );
}
}
class Antena implements Ubicado {
private Punto posicion;
public Antena (String nombre, double x, double y) {
posicion = new Punto (x, y);
}
public Punto getPosicion ( ) {
return posicion;
}
}
TelefonoMovil
estacionBase : Estacion
establecerLlamada()
colgar()
enviar()
recibir()
getPosicion()
Antena
posicion : Punto
nombre
emitir(p : Punto)
cobertura(p)
getPosicion()
Programación DIT-UPM
8
Uso del polimorfismo
l Sólo se pueden crear referencias
n Copiarlas y compararlas
n Dar valor a una referencia
¡ Hacer que apunten a un objeto de una clase real que implemente la
interfaz
• Ubicado refernenciaDeInterfaz = new ClaseQueImplementaUbicado();
n Se puede llamar sólo a los métodos cuyas cabeceras aparecen en
la clase interfaz
¡ Se ejecutarán los de los objetos reales (polimorfismo)
• En cada ejecución se mira a qué clase pertenece el objeto real y
se ejecuta el método implementado en esa clase
l No se pueden crear objetos interfaz
n No se puede hacer: Ubicado u = new Ubicado();
Programación DIT-UPM
9
Uso del polimorfismo:
ejemplo
class CalculoCobertura {
public double distanciaAlOrigen (Ubicado u) {
Punto p = u.getPosicion ( );
return Math.sqrt((p.getX() * p.getX()) + (p.getY() * p.getY()));
}
public static void main (String [] args) {
CalculoCobertura c = new CalculoCobertura ( );
Ubicado u = new TelefonoMovil ( );
...
System.out.println (c.distanciaAlOrigen (u));
u referencia a un objeto
TelefonoMovil
u = new Antena ( );
u referencia a un objeto Antena
...
System.out.println (c.distanciaAlOrigen (u));
}
}
Programación DIT-UPM
u es un TelefonoMovil.
Durante la ejecución se
ejecuta el método getPosicion
de la clase TelefonoMovil
u es una Antena. Durante la
ejecución se ejecuta el
método getPosicion de la
clase Antena
10
Conversiones
l Generalización (upcasting)
n Tratar a un objeto con una referencia de tipo más general
n Permite usar el objeto de forma más abstracta, con menos
n Sólo se pueden usar los métodos válidos por la referencia
n El compilador comprueba los métodos del tipo de la
detalles
referencia
Ubicado u1 = new TelefonoMovil();
c.distanciaAlOrigen (u1);
System.out.println (u1.getPosicion());
Ubicado u2 = new Antena();
c.distanciaAlOrigen (u2);
System.out.println (u2.getPosicion());
Programación DIT-UPM
11
l Detallado (downcasting)
Conversiones
n Convertir la referencia a un tipo más detallado
n Conversión explícita (forzada)
n Se pueden llamar a los métodos de la referencia convertida
n El compilador lo deja en manos del programador
¡ Pueden saltar excepciones ClassCastException
n Se puede verificar con el operador: instanceof()
((TelefonoMovil) u1).establecerLlamada();
((Antena) u2). cobertura (p);
((Antena) u1). cobertura (p); // ERROR u1 NO es una Antena
// error de ejecución: excepción
if (u1 instanceof Antena) ((Antena) u1).cobertura(p); //BIEN
Programación DIT-UPM
12
Jerarquías de interfaces
Una clase que implemente
Colocable tendrá:
getCentro y setCentro
interface Centrado {
public Punto getCentro();
}
interface Colocable extends Centrado {
public void setCentro (Punto p);
}
interface Escalable {
public void escala (double factor);
}
interface Trasladable extends Colocable {
public void mueve (double x, double y);
}
interface Rotable {
public void rota (double angulo);
}
interface Transformable extends Escalable, Trasladable, Rotable { }
Una clase que implemente
Trasladable tendrá:
getCentro, setCentro y
mueve
13
Una clase multifunción
l Una misma clase puede implementar varias
interfaces
interface Mamifero { void amamanta (); }
interface Oviparo { void ponHuevos (); }
class Ornitorrinco implements Mamifero, Oviparo
{ ... }
Ornitorrinco juliana= new Ornitorrinco();
juliana.ponHuevos();
juliana.amamanta();
Programación DIT-UPM
14
¿Cuándo usar interfaces?
l Nunca es malo
n aunque a veces retarda [un poquitín] la ejecución
l Cuándo se sabe qué queremos; pero
n no sabemos (aún) cómo hacerlo
n lo hará otro
n lo haremos de varias maneras
Programación DIT-UPM
15
Contenidos
l Polimorfismo
l Implementación de interfaces
l Uso de interfaces
l Jerarquías de interfaces
l Extensión
l Jerarquía de extensión
Programación DIT-UPM
16
Extensión-herencia
l Herencia: extensión
n Se parte de una clase que ya está hecha y probada
n Se crea una clase nueva que añade atributos y/o métodos
n Debe existir alguna relación lógica entre la clase ya hecha
(clase base) y la nueva (clase derivada): es-un
l El uso de la extensión permite
n Reutilizar las clases hechas como parte de nuevas clases
n Reducir tiempo y esfuerzo de desarrollo
n Aplicar el polimorfismo entre clases que se parecen
porque hay extensión entre ellas
n Cambiar el funcionamiento de algún método de la clase
base
Programación DIT-UPM
17
class Pixel extends Punto {
private String color;
public void setColor (String c) {
color = c;
}
public String getColor() {
return color;
}
public void reset () {
color = “transparent”;
}
}
Ejemplo
Punto
x : double
y : double
getX() : double
getY() : double
setX(x : double) : void
setY(x : double) : void
modulo() : double
reset() : void
Relación de
extensión
“es-un”
Pixel
color : String
getColor() : String
setColor(color : String) : void
reset() : void
Programación DIT-UPM
18
Polígono
Relación de extensión
l Un triángulo es un polígono
l Un cuadrilátero es un polígono
l Un cuadrado es un cuadrilátero,
l Un rectángulo es un cuadrilátero,
que es un polígono
Triángulo
Cuadrilátero
que es un polígono
n Un rectángulo tiene todas
las características de un
cuadrilátero y todas las de
un polígono
Cuadrado
Rectángulo
Programación DIT-UPM
19
Efectos de la herencia
l Herencia de la interfaz
¡
¡
n la interfaz de la
Comentarios de: Tema 7: Relaciones entre clases (0)
No hay comentarios