Вы находитесь на странице: 1из 41

Robert Espinoza Domínguez

Polimorfismo
Polimorfismo

 Permite que diferentes objetos respondan de modo


diferente al mismo mensaje. Por ejemplo un objeto del
tipo Animal se moverá dependiendo de que animal
sea, si es un pez se moverá de una forma distinta a
una tortuga.
 Al redefinir métodos, objetos de diferentes tipos
pueden responder de forma diferente a la misma
llamada (y podemos escribir código de forma general
sin preocuparnos del método concreto que se
ejecutará en cada momento).
 Por ejemplo supongamos que declaramos:
Persona p;
Polimorfismo

 Podría suceder que durante la ejecución del programa


p referencie a un profesor o a un alumno en diferentes
momentos.
 Entonces:
 Si p referencia a un alumno, con p.toString() se ejecuta el
toString de la clase Alumno.
 Si p referencia a un profesor, con p.toString() se ejecuta
el toString de la clase Profesor.
Ligadura

 Representa una conexión entre una entidad y sus


propiedades.
 Desde el punto de vista de atributos, la ligadura es el
proceso de asociar un atributo a un nombre.
 Si la propiedad se limita a métodos, ligadura es la
conexión entre la llamada al método y el código que se
ejecuta tras la llamada.
 Se encarga de ligar o relacionar la llamada a un método
con el cuerpo del método que se ejecuta finalmente.
Tipos de ligadura

 Se clasifica según sea el tiempo de la ligadura


(momento en que un atributo o método se asocia con
sus valores o métodos) en:
 Ligadura estática (temprana)
 Se produce durante la compilación,

 En el caso de los métodos, antes de la ejecución


según el tipo declarado del objeto al que se manda el
mensaje.
 Ligadura dinámica (tardía)
 Ocurre durante la ejecución.

 Es la forma dinámica del objeto, la que determina la


versión del método a ejecutar.
Polimorfismo estático o Ad hoc

 Polimorfismo con ligadura estática se produce cuando


se define un método polimórfico para diferentes clases
de una familia y el código real del método se conecta
o enlaza en tiempo de compilación.
 Los métodos sobrecargados se enlazan estáticamente.
 Cuando se llama a un método , el compilador
determina en tiempo de compilación cuál es el método
a llamar basado en el número y tipo de datos de los
parámetros del método.

Sobrecarga de Enlace estático


métodos  (t. de compilación)
Polimorfismo sin ligadura dinámica
double p; double a;
switch (tipoFigura)
{
case 1: // Es un círculo
a = miCirculo.area();
p = miCirculo.perimetro();
break;
case 2: // Es un rectángulo
a = miRectangulo.area();
p = miRectangulo.perimetro();
break;
}
Polimorfismo con ligadura dinámica

 Con ligadura dinámica o postergada (tardía), el tipo de


objeto no es preciso definirlo hasta el momento de la
ejecución.
 Se produce cuando un método polimórfico se define
para clases diferentes de una familia pero el código
real del método no se conecta o enlaza hasta el tiempo
de ejecución.
 La ligadura dinámica en Java se implementa
normalmente mediante métodos abstractos que se
deben redefinir en las clases derivadas.
 El polimorfismo se puede representar como un arreglo
de elementos que se refieren a objetos de diferentes
tipos.
Polimorfismo con ligadura dinámica

Figura
<<Abstract>>

Circulo Cuadrado Rectangulo


Polimorfismo con ligadura dinámica

Figura v[] = new Figura[10];


for (int i = 0; i <10; i++){
switch (tipo){
case 1: v[i] = new Cuadrado (…); break;
case 2: v[i] = new Rectangulo (…); break;
case 3: v[i] = new Circulo (…); break;
}
}
for (int i = 0; i <10; i++)
System.out.println(v[i]); //enlace dinámico con toString();
Polimorfismo con ligadura dinámica

Persona
<<Abstract>>

AlumnoPre AlumnoPos Docente Administrativo


2. Objetivos

public class TPersonas{


public static void main(String ar[]){
Persona persons[]= new Persona[4];

persons[0] = new AlumnoPre(“Luis”);


persons[1] = new AlumnoPos(“John”);
persons[2] = new Docente(“Luis Perez”);
persons[3] = new Administrativo(“Karenina”);
for(int i =0;i<persons.length;i++){
System.out.println(persons[i]);
}
}
}
Upcasting y Downcasting

 Los mecanismos de up y downcasting relacionados


otorgan a la OO una gran potencia frente a otros
paradigmas de programación. Realizan conversiones
de tipo, no modifican al objeto.
 Upcasting. Interpretar un objeto de una sub clase como
el mismo tipo de la clase base.
 Es automático
 DownCasting. Interpretar un objeto de la súper clase
como el mismo tipo de la su subclase.
 Se especifica precediendo al objeto a convertir con el
nuevo tipo entre paréntesis.
Upcasting y Downcasting
Figura
<<Abstract>>

Figura2D Figura3D
<<Abstract> <<Abstract>

Cuadrado Circulo Rombo Cubo Pirámide


Upcasting y Downcasting

 Una variable referencia es polimórfica cuando


su tipo de declaración no coincide con el tipo de
objeto al que referencia.

Figura f2 = new Circulo (“rojo”, 6.0);

f2 apunta a un objeto de tipo Circulo


instanceof

 instanceOf() Para determinar si el objeto es de la clase


esperada antes de realizar el casting.

public class Vehiculos {


private String modelo;
private String color;
// metodos...
}
public class Coches extends Vehiculos{
private int puertas;
public static void main (String[] args){
Coches coche1 = new Coches();
if(coche1 instanceof Vehiculos)
System.out.println("coche1 es un coche y
también un vehiculo.");
}
}
Objetivos

 Flexibilidad y reutilización.
 Facilidad para adaptarse a cambios.
 Implementación de colecciones y métodos genéricos.
 Se consigue con:
 Métodos polimórficos
 Interfaces
 Clases Abstractas
Objetivos

 Permite código independiente del tipo


 Fácil de entender y de escribir
 Cuando se añaden nuevos:
 Programas extensibles
 No hay necesidad de re escribir el código
Formas de polimorfismo

 Polimorfismo de asignación (variables polimórficas)


 Polimorfismo de sobrecarga o funcional (ad hoc)
 Polimorfismo de redefinición (inclusión) o de
vinculación dinámica
 Polimorfismo paramétrico o genericidad
 Polimorfismo puro (función polimórfica)
Polimorfismo de Asignación

 Capacidad de un entidad de referenciar en tiempo de


ejecución a objetos de diferentes clases
 Una variable referencia es polimorfa cuando su tipo de
declaración no coincide con el tipo del objeto al que
referencia

Persona
• Esta restringido por la herencia
• El polimorfismo implica que una
variable implica un tipo estático y un
tipo dinámico
AlumnoPre
Polimorfismo de asignación

Asignación ordinaria
Persona p = new Persona();

Tipo estático Tipo dinámico

(p apunta a un objeto de tipo Persona)

Asignación polimórfica
Persona ap = new AlumnoPre();

Tipo estático Tipo dinámico


(ap apunta a un objeto de tipo AlumnoPre)
Polimorfismo de Asignación

Tipo estático vs tipo dinámico


 Tipo estático. Tipo asociado a la declaración

 Tipo dinámico. Tipo correspondiente a la clase del

objeto conectado a la entidad en tiempo de ejecución.


 El polimorfismo se presenta cuando se envía un

mensaje a un objeto , ejecutándose el método


adecuado de acuerdo con su tipo
 El enlace dinámico. Se elige el método a ejecutar en

tiempo ejecución en función de la clase del objeto.


Polimorfismo de Asignación

 En Java es posible asignar un objeto de una clase a


una variable de su superclase
 Una variable referencia es polimórfica cuando su tipo
de declaración no coincide con el tipo de objeto a que
referencia (ap1)

Persona
//Asignación Polimórfica
Persona ap1=new AlumnoPre();
AlumnoPre
3.1 Polimorfismo de asignación

AlumnoPre ap = new AlumnoPre(); //Asignación ordinaria


Persona p = ap; //Asignación polimórfica

Persona

ap
ap: AlumnoPre
p
AlumnoPre

Casting automático
AlumnoPre ap=new AlumnoPre(); //Asignación ordinaria
Persona p=ap; //Asignación polimórfica

Casting Explícito
Persona p=new AlumnoPre();
AlumnoPre ap=(AlumnoPre) p;
3.1 Polimorfismo de asignación

Se puede utilizar la variable para:


• Para invocar los métodos a la que pertenece el objeto, sino
• También para invocar a los métodos que están definidos en el
superclase.
Con el enlace polimorfo únicamente podemos accesar a las
operaciones pertenecientes a la clase asociada a la referencia
AlumnoPre ap1=new Persona () //Asignación Polimórfica

Persona

AlumnoPre
Polimorfismo de Sobrecarga

Sobrecarga o funcional:
 Dos o más funciones comparten el nombre y distintos
argumentos (en numero y tipos). En este caso el nombre
es polimórfico.
 Distintas definiciones y tipos: genera distintos
comportamientos
 La función correcta se determina en tiempo de compilación
según la signatura.
 Sobrecarga. Varias implementaciones del mismo método
con distintos parámetros: cambio de interfaz, habitual en
constructores
 Podemos apreciar el polimorfismo
 Sobrecargando el constructor dotamos de flexibilidad a la
clase
Polimorfismo de Redefinición

Sea el mensaje x.f (), la


comprobación estática de tipos
garantiza que al menos existirá A
una versión aplicable para f, y la
ligadura dinámica garantiza que
B C
se ejecutará la versión más
apropiada.
D

Sobreescritura. La subclase
reescribe el método heredado o sea
cambia el comportamiento.
Polimorfismo de Redefinición

f es el método sobrescrito
A
A oa;
B ob = new B();
D od = new D(); B C

oa = ob;
oa.f(); //¿que método se activa?
D

oa = od;
oa.f(); //¿que método se activa?
Polimorfismo paramétrico o genericidad

 Un único código con diferentes interpretaciones en


tiempo de ejecución
 Es fundamental que el lenguaje soporte el
polimorfismo
 El mismo código ejecutará cosas distintas en
función del tipo dinámico de la entidad polimórfica
(ligadura dinámica)
 Gracias al polimorfismo y la ligadura dinámica se
satisface el criterio de reutilización de variación de
la implementación.
Polimorfismo paramétrico o genericidad

Clase Object
 Puede existir una clase “raíz” de la cual heredan las
demás, en Java es la clase Object
 La clase Object incluye las características comunes a
todos los objetos
 Una variable de tipo Object puede apuntar a cualquier
tipo del lenguaje, incluidos los tipos primitivos
(autoboxing)
Object oval = 7;
double odo = (Double)oval;
Polimorfismo paramétrico o genericidad

Algunos Métodos de la Clase Object


 public boolean equals(Object obj)

 Igualdad de objetos
 protected Object clone()
 Copia de objetos
 public String toString()
 Representación textual de un objeto
 public class getClass()
 Clase a partir de la que ha sido instanciado un objeto.
 public int hashCode()
 Código hash utilizado en las colecciones.
Polimorfismo paramétrico o genericidad

Genericidad en Java
 A partir de la versión 5 se incluye la definición de
clases genéricas como elemento del lenguaje:
List<T>
 Las operaciones aplicables sobre una entidad
genérica (variable o atributo de tipo T) son las
operaciones disponible para cualquier tipo.
 Cuando se instancia una clase genérica el conjunto
de posibles tipos que puede contener viene
determinado por la jerarquía de herencia
 List<Deposito> //contendrá cualquier tipo de
depósito.
Polimorfismo paramétrico o genericidad

Clases Abstractas
 Toda clase que contenga algún método abstracto
(heredado o no) es abstracta.
 Una clase puede ser abstracta y no contener ningún
método abstracto.
 Especifica una funcionalidad que es común a un
conjunto de subclases aunque no es completa.
 Puede ser total o parcialmente abstracta.
 No es posible crear instancias de una clase
abstracta, pero si declarar entidades de estas clases.
 Aunque la clase puede incluir la definición del constructor.
 Las clases abstractas sólo tienen sentido en un
lenguaje con comprobación estática de tipos.
Polimorfismo paramétrico o genericidad

Interfaces en Java
 Por defecto, toda la definición de una interfaz es

pública
 Sólo contiene definiciones de métodos y constantes

 Los métodos son abstractos, no es necesario especificarlo


explícitamente
 No se puede crear un objeto del tipo de la interfaz,
pero si utilizarlo en la declaración de variables.
 Una interfaz es un tipo
Polimorfismo paramétrico o genericidad

Implementación de Interfaces en Java


 Se dice que una clase implementa una interfaz

 La clase debe implementar los métodos definidos en la


interfaz
 Si una clase no implementa todos los métodos de una
interfaz debe declararse como abstracta
 Útiles para dar soporte a la herencia múltiple en Java
 Una clase puede heredar de una única clase
 Puede implementar más de una interfaz
 Una interfaz puede extender más de una interfaz
Polimorfismo paramétrico o genericidad

Colecciones en Java
 Las colecciones en Java son un ejemplo destacado de

implementación de código reutilizable utilizando un


lenguaje orientado a objetos.
 Todas las colecciones son genéricas e iterables.

 Los tipos abstractos de datos se definen como


interfaces.
 Se implementan clases abstractas que permiten

factorizar el comportamiento común a varias


implementaciones.
 Un mismo TAD puede ser implementado por varias

clases List: LinkedList, ArrayList


Polimorfismo paramétrico o genericidad

Colecciones en Java: Iteradores


 Las colecciones de Java son iterables.

 El recorrido for each sólo es aplicable sobre objetos

iterables
 Evita tener que manejar explícitamente el objeto
iterador.
 La implementación de un iterador requiere crear
una clase responsable de llevar el estado de la
iteración
Polimorfismo paramétrico o genericidad

Colecciones en Java: Interfaz Iterator <TD>:


 hasNext()

Indica si quedan elementos en la iteración.


 next():

Devuelve el siguiente elemento de la iteración.


 remove():

Elimina el último elemento devuelto por el iterador.


Polimorfismo puro o de datos

 Es la capacidad de un identificador para hacer referencia a


instancias de distintas clases. Un Método que puede recibir
como parámetros objetos diferentes
 Aumenta las posibilidades de reutilización de código , lo cual
favorece la construcción de módulos como extensión de otros
ya existentes.
 Tipo estático. Se declara una referencia o variable
 Tipo dinámico. Objeto asociado a una referencia en un momento
dado.
 En LOO sin comprobación de tipos como smalltalk el
polimorfismo es total mientras en Java –con comprobación de
tipos- el polimorfismo esta limitado por la herencia.
 El parámetro es una entidad polimórfica
Polimorfismo puro vs sobrecarga

Funciones puras ≠ funciones sobrecargadas


 Funciones Sobrecargadas

 Dos o más funciones comparten el nombre y distintos


parámetros (en numero y tipo). El nombre es polimórfico.
 Distintas definiciones y tipos (distintos comportamientos)
 La función correcta se determinan en tiempo de
compilación según la signatura
 Funciones polimórficas
 Una única función que puede recibir una variedad de
argumentos (comportamiento uniforme)
 La ejecución correcta se determina dinámicamente en
tiempo de ejecución
Polimorfismo puro vs sobrecarga

Funciones puras ≠ funciones sobrecargadas


 F. Sobrecargadas. Un código para cada tipo de
persona
public void mostrar(Profesor per){…}
public void mostrar(Alumno per){…}

 F. polimórficas. Un código con distintas


interpretaciones.
public void mostrar(Persona per){…}