Escolar Documentos
Profissional Documentos
Cultura Documentos
Manuel Montenegro
Dpto. Sistemas Informticos y Computacin
16/Mayo/2012 5. Polimorfismo 2
Polimorfismo
Capacidad de enviar un mismo mensaje a
distintos objetos de naturaleza heterognea.
ntimamente relacionado con el concepto de
herencia.
Persona
Estudiante Empleado
EmpleadoComision
16/Mayo/2012 5. Polimorfismo 3
Polimorfismo
Persona
El mtodo imprimirDatos()
String nombre;
Fecha fechaNacimiento;
tiene una funcionalidad
int dni; distinta segn el objeto que
<<constructor>>
String getNombre()
reciba la mensaje.
Fecha getFechaNacimiento()
int getDni()
void imprimirDatos() Persona p = new Persona(...);
Empleado e = new Empleado(...);
Empleado p.imprimirDatos();
e.imprimirDatos();
int sueldoBase;
<<constructor>>
int getSueldo()
void imprimirDatos()
16/Mayo/2012 5. Polimorfismo 4
Polimorfismo
Empleado
El mtodo getSueldo() calcula
int sueldoBase; de forma distinta el sueldo del
<<constructor>>
int getSueldo()
empleado, segn si trabaja o
void imprimirDatos() no a comisin.
Empleado e = new Empleado(...);
EmpleadoComision ec = new EmpleadoComision(...);
16/Mayo/2012 5. Polimorfismo 5
Polimorfismo
Rectangulo
Punto origen;
int ancho;
El mtodo dibujar(Ventana v)
int alto; llama a funciones distintas de
<<constructor>>
Punto getOrigen()
Ventana segn la clase de
int getAncho() figura geomtrica a la que se
int getAlto()
double area() aplique.
double perimetro()
void dibujar(Ventana v)
RectanguloColor RectanguloRelleno
Color colorBorde; Color colorRelleno;
<<constructor>> <<constructor>>
Color getColorBorde() Color getColorRelleno()
void dibujar(Ventana v) void dibujar(Ventana v)
16/Mayo/2012 5. Polimorfismo 6
Contenidos
Introduccin.
Conversin entre tipos.
Vinculacin dinmica.
Polimorfismo mediante ejemplos.
Clases abstractas.
Interfaces.
16/Mayo/2012 5. Polimorfismo 7
Conversin de tipos
Hemos visto los elementos de un tipo pueden
convertirse a un tipo ms amplio o general.
La conversin es segura.
int entero = 4;
double real;
real = entero;
La conversin en sentido contrario tambin es
posible, pero ha de indicarse explcitamente.
Puede haber prdida de informacin.
int entero;
double real = 5.34;
entero = (int) real;
16/Mayo/2012 5. Polimorfismo 8
Conversin hacia arriba (upcasting)
Similarmente, podemos asignar un objeto de
una clase B a una variable de tipo A, si A es
superclase (directa o indirecta) de B.
Persona p;
Empleado e = new Empleado(...);
p = e;
16/Mayo/2012 5. Polimorfismo 9
Conversin hacia arriba (upcasting)
Similarmente, podemos asignar un objeto de
una clase B a una variable de tipo A, si A es
superclase (directa o indirecta) de B.
Esta conversin es segura, ya que la herencia
modela la relacin es-un.
Un Empleado es una Persona.
16/Mayo/2012 5. Polimorfismo 10
Conversin hacia abajo (downcasting)
Es posible asignar una variable de un tipo A a
otra de un tipo B, si B es subclase de A.
Pero esta conversin no siempre es correcta, y
ha de indicarse explcitamente.
Persona p = new Empleado(...);
Empleado e = (Empleado) p; Correcto
16/Mayo/2012 5. Polimorfismo 11
Conversin hacia abajo (downcasting)
Es posible asignar una variable de un tipo A a
otra de un tipo B, si B es subclase de A.
Pero esta conversin no siempre es correcta, y
ha de indicarse explcitamente.
Persona p = new EmpleadoComision(...);
Empleado e = (Empleado) p; Correcto
16/Mayo/2012 5. Polimorfismo 12
Contenidos
Introduccin.
Conversin entre tipos.
Vinculacin dinmica.
Polimorfismo mediante ejemplos.
Clases abstractas.
Interfaces.
16/Mayo/2012 5. Polimorfismo 13
Vinculacin dinmica
El compilador determina los mensajes que
puede recibir un objeto a partir de su tipo.
p.getNombre();
p.getFechaNacimiento() p.getSueldo()
p.getDni(); p.setSueldo(...)
p.setNombre(...);
p.imprimirDatos();
El definido en Persona?
p.imprimirDatos(); O el definido en Empleado?
16/Mayo/2012 5. Polimorfismo 14
Vinculacin dinmica
La decisin del mtodo especfico a ejecutar se
realiza en tiempo de ejecucin, y en base a la
clase real del objeto, no a su tipo.
p.imprimirDatos();
Aunque p sea de tipo Persona, contiene un
Empleado. Por tanto, se llamar al mtodo
imprimirDatos() reescrito en esta ltima clase.
16/Mayo/2012 5. Polimorfismo 15
Ejemplo: imprimirDatos
public class Empleado extends Persona {
protected int sueldoBase;
public void imprimirDatos() {
super.imprimirDatos();
System.out.print("SUELDO: ");
System.out.println(this.getSueldo());
}
}
16/Mayo/2012 5. Polimorfismo 16
Ejemplo: Rectangulo
Ventana v = new Ventana();
v.abrir();
Rectangulo r = new RectanguloRelleno(new Punto(10,10), 100, 100,
Color.AZUL, Color.NARANJA);
r.dibujar(v);
Color c = r.getColorRelleno();
Color c = ((RectanguloRelleno) r).getColorRelleno();
16/Mayo/2012 5. Polimorfismo 17
Contenidos
Introduccin.
Conversin entre tipos.
Vinculacin dinmica.
Polimorfismo mediante ejemplos.
Clases abstractas.
Interfaces.
16/Mayo/2012 5. Polimorfismo 18
Motivacin de polimorfismo
El polimorfismo permite tratar con conjuntos
de elementos de manera genrica.
Persona[] personas = new Persona[10];
16/Mayo/2012 5. Polimorfismo 19
Ejemplo: Listado de personas
public class TestEmpleado
{
public static void imprimirListado(Persona[] personas) {
System.out.println("DNI Nombre Fecha de Nacimiento");
System.out.println("------------------------------------------------------------");
for (Persona p : personas) {
System.out.printf("%-9d %-30s %s\n", p.getDni(),
p.getNombre(), p.getFechaNacimiento());
}
}
16/Mayo/2012 5. Polimorfismo 20
Ejemplo: Listado de personas
16/Mayo/2012 5. Polimorfismo 21
Ejemplo: Listado de personas
public class TestEmpleado
{
public static void imprimirListadoExtendido(Persona[] personas) {
System.out.println("---------------------------------------");
for (Persona p : personas) {
p.imprimirDatos();
System.out.println("---------------------------------------");
}
}
}
16/Mayo/2012 5. Polimorfismo 22
Ejemplo: Figuras geomtricas
Figura
Rectangulo Circulo
Cuadrado RectanguloColor
RectanguloRelleno
16/Mayo/2012 5. Polimorfismo 23
Ejemplo: Figuras geomtricas
Podemos abstraer las propiedades y mtodos
comunes en Rectangulo y Circulo.
Figura
Punto posicion;
<<constructor>>
void dibujar(Ventana v);
El mtodo dibujar() ser sobreescrito por las
subclases Rectangulo y Circulo, que llamarn a
las funciones correspondientes de la clase
Ventana.
16/Mayo/2012 5. Polimorfismo 24
Ejemplo: Figuras geomtricas
public class Escenas
{
public static void dibujarEscena(Figura[] figuras, Ventana v) {
for (Figura f : figuras) {
f.dibujar(v);
}
}
16/Mayo/2012 5. Polimorfismo 25
Ejemplo: Figuras geomtricas
16/Mayo/2012 5. Polimorfismo 26
Contenidos
Introduccin.
Conversin entre tipos.
Vinculacin dinmica.
Polimorfismo mediante ejemplos.
Clases abstractas.
Interfaces.
16/Mayo/2012 5. Polimorfismo 27
Clases abstractas
}
?
}
16/Mayo/2012 5. Polimorfismo 28
Clases abstractas
Qu se debera pintar en la clase Figura?
Estamos a un nivel de abstraccin demasiado
elevado como para dibujar algo concreto en la
ventana.
...pero la capacidad de dibujar es algo comn a
todas las figuras.
Tiene sentido crear instancias de Figura?
Figura f = new Figura(new Punto(100,100)); ?
16/Mayo/2012 5. Polimorfismo 29
Clases abstractas
Figura es una clase abstracta:
Slo tiene sentido como abstraccin de lo que es
comn a varios tipos de figuras.
abstract public class Figura { Clase abstracta
protected Punto posicion;
16/Mayo/2012 5. Polimorfismo 30
Clases abstractas
16/Mayo/2012 5. Polimorfismo 31
Contenidos
Introduccin.
Conversin entre tipos.
Vinculacin dinmica.
Polimorfismo mediante ejemplos.
Clases abstractas.
Interfaces.
16/Mayo/2012 5. Polimorfismo 32
Interfaces
Son clases abstractas sin atributos, cuyos
mtodos son todos abstractos.
public interface Dibujable {
public void dibujar(Ventana v);
}
public interface Cuerpo {
public void sumarCon(Cuerpo otro);
public void multiplicarCon(Cuerpo otro);
}
16/Mayo/2012 5. Polimorfismo 33
Interfaces
Una clase puede heredar una interfaz
mediante la clusula implements.
public class Complejo implements Cuerpo {
private double real;
private double imag;
16/Mayo/2012 5. Polimorfismo 34
Interfaces
Si una clase implementa una interfaz, ha de
reescribir todos los mtodos de la misma.
public class Fecha implements Comparable {
private int convertirANumero() {
return ao * 10000 + mes * 100 + dia;
}
public int compareTo(Object o) {
if (o instanceof Fecha) {
Fecha f = (Object) o;
return this.convertirANumero() - f.convertirANumero();
} else {
// ERROR
}
}
}
16/Mayo/2012 5. Polimorfismo 35
Interfaces
Si una clase implementa una interfaz, ha de
reescribir todos los mtodos de la misma.
16/Mayo/2012 5. Polimorfismo 36
Interfaces
Una clase puede implementar varias
interfaces.
public class A implements Comparable, Dibujable {
16/Mayo/2012 5. Polimorfismo 37