Polimorfismo
Java y Servicios Web I
Master en Ingeniería Matemática
Manuel Montenegro
Dpto. Sistemas Informáticos y Computación
Desp. 467 (Mat)
[email protected]
Contenidos
● Introducción.
● Conversión entre tipos.
● Vinculación dinámica.
● Polimorfismo mediante ejemplos.
● Clases abstractas.
● Interfaces.
16/Mayo/2012
5. Polimorfismo
2
Polimorfismo
● Capacidad de enviar un mismo mensaje a
distintos objetos de naturaleza heterogénea.
● Íntimamente relacionado con el concepto de
herencia.
Persona
Estudiante
Empleado
EmpleadoComision
16/Mayo/2012
5. Polimorfismo
3
Polimorfismo
● El método imprimirDatos()
tiene una funcionalidad
distinta según el objeto que
reciba la mensaje.
Persona p = new Persona(...);
Empleado e = new Empleado(...);
p.imprimirDatos();
e.imprimirDatos();
Persona
String nombre;
Fecha fechaNacimiento;
int dni;
<<constructor>>
String getNombre()
Fecha getFechaNacimiento()
int getDni()
void imprimirDatos()
Empleado
int sueldoBase;
<<constructor>>
int getSueldo()
void imprimirDatos()
16/Mayo/2012
5. Polimorfismo
4
Polimorfismo
Empleado
int sueldoBase;
<<constructor>>
int getSueldo()
void imprimirDatos()
● El método getSueldo() calcula
de forma distinta el sueldo del
empleado, según si trabaja o
no a comisión.
Empleado e = new Empleado(...);
EmpleadoComision ec = new EmpleadoComision(...);
EmpleadoComision
int dineroVentas;
double porcentajeComision;
int sueldo1 = e.getSueldo();
int sueldo2 = ec.getSueldo();
<<constructor>>
double getPorcentajeComision()
int getSueldo()
16/Mayo/2012
5. Polimorfismo
5
Polimorfismo
● El método dibujar(Ventana v)
llama a funciones distintas de
Ventana según la clase de
figura geométrica a la que se
aplique.
Rectangulo
Punto origen;
int ancho;
int alto;
<<constructor>>
Punto getOrigen()
int getAncho()
int getAlto()
double area()
double perimetro()
void dibujar(Ventana v)
RectanguloColor
Color colorBorde;
<<constructor>>
Color getColorBorde()
void dibujar(Ventana v)
RectanguloRelleno
Color colorRelleno;
<<constructor>>
Color getColorRelleno()
void dibujar(Ventana v)
16/Mayo/2012
5. Polimorfismo
6
Contenidos
● Introducción.
● Conversión entre tipos.
● Vinculación dinámica.
● Polimorfismo mediante ejemplos.
● Clases abstractas.
● Interfaces.
16/Mayo/2012
5. Polimorfismo
7
Conversión de tipos
● Hemos visto los elementos de un tipo pueden
convertirse a un tipo más amplio o general.
● La conversión es segura.
int entero = 4;
double real;
real = entero;
● La conversión en sentido contrario también es
posible, pero ha de indicarse explícitamente.
● Puede haber pérdida de información.
int entero;
double real = 5.34;
entero = (int) real;
16/Mayo/2012
5. Polimorfismo
8
Conversión 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
Conversión 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 = new Empleado(...);
p es de tipo Persona, y sólo
podrá acceder a los métodos
de la clase Persona
● Esta conversión es segura, ya que la herencia
modela la relación es-un.
● Un Empleado es una Persona.
16/Mayo/2012
5. Polimorfismo
10
Conversión 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 conversión no siempre es correcta, y
ha de indicarse explícitamente.
Persona p = new Empleado(...);
Empleado e = (Empleado) p;
Persona p = new Estudiante(...);
Empleado e = (Empleado) p;
Persona p = new Persona(...);
Empleado e = (Empleado) p;
Correcto
Error
Error
16/Mayo/2012
5. Polimorfismo
11
Conversión 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 conversión no siempre es correcta, y
ha de indicarse explícitamente.
Persona p = new EmpleadoComision(...);
Empleado e = (Empleado) p;
Correcto
16/Mayo/2012
5. Polimorfismo
12
Contenidos
● Introducción.
● Conversión entre tipos.
● Vinculación dinámica.
● Polimorfismo mediante ejemplos.
● Clases abstractas.
● Interfaces.
16/Mayo/2012
5. Polimorfismo
13
Vinculación dinámica
● El compilador determina los mensajes que
puede recibir un objeto a partir de su tipo.
Persona p = new Empleado(...);
p.getNombre();
p.getFechaNacimiento()
p.getDni();
p.setNombre(...);
p.imprimirDatos();
p.getSueldo()
p.setSueldo(...)
p.imprimirDatos();
¿El definido en Persona?
¿O el definido en Empleado?
16/Mayo/2012
5. Polimorfismo
14
Vinculación dinámica
● La decisión del método específico a ejecutar se
realiza en tiempo de ejecución, 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 método
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());
}
}
public class TestEmpleadoComision {
public static void main(String[] args) {
EmpleadoComision ec = new EmpleadoComision(“Fuckencio Martinez”,
new Fecha(15, 3, 1979),
123456, 1000, 20);
ec.vender(200);
ec.imprimirDatos();
}
}
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
● Introducción.
● Conversión entre tipos.
● Vinculación dinámica.
● Polimorfismo mediante ejemplos.
● Clases abstractas.
● Interfaces.
16/Mayo/2012
5. Polimorfismo
18
Motivación de polimorfismo
● El polimorfismo permite tratar con conjuntos
de elementos de manera genérica.
Persona[] personas = new Persona[10];
Puede contener empleados,
estudiantes, o cualquier cosa
que se derive de Persona
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());
}
}
public static void main(String[] args) {
Persona[] personas = new Persona[4];
personas[0] = new Persona("David Fernández Esteban",
new Fecha(23, 5, 1980), 47839244);
personas[1] = new Empleado("Enrique Martín Martín",
new Fecha(1, 1, 1981), 38493212, 1600);
personas[2] = new Estudiante("Ignacio Castiñeiras Perez",
new Fecha(2, 2, 1983), 50120234);
personas[3] = new EmpleadoComision("Laura Díaz Agrela",
new Fecha(26, 6, 1987), 10938464, 1000, 20);
imprimirListado(personas);
}
}
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 geométricas
Figura
Rectangulo
Circulo
Cuadrado
RectanguloColor
RectanguloRelleno
16/Mayo/2012
5. Polimorfismo
23
Ejemplo: Figuras geométricas
● Podemos abstraer las propiedades y métodos
comunes en Rectangulo y Circulo.
Figura
Punto posicion;
<<constructor>>
void dibujar(Ventana v);
● El método dibujar() será sobreescrito por las
subclases Rectangulo y Circulo, que llamarán a
las funciones correspondientes de la clase
Ventana.
16/Mayo/2012
5. Polimorfismo
24
Ejemplo: Figuras geométricas
public class Escenas
{
public static void dibujarEscena(Figura[] figuras, Ventana v) {
for (Figura f : figuras) {
f.dibujar(v);
}
}
public static void main(String[] args) {
Ventana v = new Ventana();
Figura[] circulos = new Figura[10];
for (int i = 1; i <= 10; i++) {
circulos[i-1] = new Circulo(new Punto(150, 150), i*10);
}
v.abrir();
dibujarEscena(circulos, v);
}
}
16/Mayo/2012
5. Polimorfismo
25
Ejemplo: Figuras geométricas
16/Mayo/2012
5. Polimorfismo
26
Contenidos
● Introducción.
● Conversión entre tipos.
● Vinculación dinámica.
● Polimorfismo mediante ejemplos.
● Clases abstractas.
● Interfaces.
16/Mayo/2012
5. Polimorfismo
27
Clases abstractas
● Comenzamos a implementar Figura
public class Figura {
protected Punto posicion;
public Figura(Punto posicion) {
this.posicion = posicion;
}
public Punto getFigura() {
return posicion;
}
public void dibujar(Ventana v) {
}
}
?
16/Mayo/2012
5. Polimorfismo
28
Clases abstractas
● ¿Qué se debería pintar
Comentarios de: Polimorfismo - Java y Servicios Web I - Master en Ingeniería Matemática (0)
No hay comentarios