Publicado el 24 de Junio del 2017
1.404 visualizaciones desde el 24 de Junio del 2017
1,2 MB
113 paginas
Creado hace 17a (30/01/2008)
TEMA 4
POLIMORFISMO
Cristina Cachero, Pedro J. Ponce de León
4 Sesiones (6 horas)
Versión 0.9
Depto. Lenguajes y Sistemas Informáticos
Tema 4. Polimorfismo
Objetivos básicos
Comprender el concepto de polimorfismo
Conocer y saber utilizar los diferentes tipos de polimorfismo.
Comprender el concepto de enlazado estático y dinámico en los
lenguajes OO.
Comprender la relación entre polimorfismo y herencia en los lenguajes
fuertemente tipados.
Apreciar la manera en que el polimorfismo hace que los sistemas sean
extensibles y mantenibles.
Curso 07-08
2
Indice
1. Motivación y conceptos previos
Signatura y ámbito
Tiempo de enlace
2. Polimorfismo y reutilización
Definición
Tipos de polimorfismo
3. Sobrecarga
Sobrecarga basada en ámbito
Sobrecarga basada en signatura de tipo
Alternativas a la sobrecarga
4. Polimorfismo en jerarquías de herencia
Redefinición
Shadowing
Sobrescritura
5. Variables polimórficas
La variable receptora
Downcasting
Polimorfismo puro
6. Genericidad
Funciones genéricas en C++
Plantillas de clase en C++
Herencia en clases genéricas
Curso 07-08
3
1. Motivación
Objetivo de la POO
Aproximarse al modo de resolver problemas en el mundo
real.
El polimorfismo es el modo en que los lenguajes OO
implementan el concepto de polisemia del mundo
real:
Un único nombre para muchos significados, según el
contexto.
Curso 07-08
4
1. Conceptos previos:
Signatura
Signatura de tipo de un método:
Descripción de los tipos de sus argumentos, su orden y
el tipo devuelto por el método.
Notación: <argumentos> <tipo devuelto>
Omitimos el nombre del método, el de la clase a la que
pertenece (el tipo del receptor)
Ejemplos
double power (double base, int exp)
double*int double
bool Casilla::setPieza(Pieza& p)
Pieza bool
Curso 07-08
5
1. Conceptos previos:
Ámbito
Ámbito de un nombre:
Porción del programa en la cual un nombre puede ser utilizado de una
determinada manera.
Ejemplo:
double power (double base, int exp)
La variable base sólo puede ser utilizada dentro del método power
Ámbitos activos: puede haber varios simultáneamente
class A {
int x,y;
public:
void f() {
// Ámbitos activos:
// GLOBAL
// CLASE (atribs. de clase y de instancia)
// METODO (argumentos, var. locales)
if (…) {
string s;
// LOCAL (var. locales)
}
}
Curso 07-08
6
1. Conceptos previos:
Tiempo de enlace
Momento en el que se identifica el fragmento de código a ejecutar asociado a
un mensaje (llamada a método) o el objeto concreto asociado a una variable.
Tiempo de Compilación: Enlace estático (early binding)
Tiempo de Ejecución: Enlace dinámico (late binding):
EFICIENCIA
FLEXIBILIDAD
Aplicable a:
OBJETOS:
Con enlace estático el tipo de objeto que contiene una variable se determina en
tiempo de compilación.
Con enlace dinámico el tipo de objeto al que hace referencia una variable no está
predefinido, por lo que el sistema gestionará la variable en función de la naturaleza real
del objeto que referencie en cada momento.
Lenguajes como Smalltalk siempre utilizan enlace dinámico con variables
C++ sólo permite enlace dinámico con variables cuando éstos son punteros, y
sólo dentro de jerarquías de herencia.
OPERACIONES:
Con enlace estático la elección de qué método será el encargado de responder a un
mensaje se realiza en tiempo de compilación, en función del tipo que tenía el objeto
destino de la llamada en tiempo de compilación.
Con enlace dinámico la elección de qué método será el encargado de responder a un
mensaje se realiza en tiempo de ejecución, en función del tipo correspondiente al
objeto que referencia la variable mediante la que se invoca al método en el instante
actual.
Curso 07-08
7
1. Conceptos previos:
Tiempo de enlace
El tipo de lenguaje utilizado (fuertemente o débilmente tipado)
determina su soporte al enlace dinámico:
Lenguaje fuertemente tipado
Lenguajes Procedimentales: no soportan enlace dinámico: el tipo de toda
expresión (identificador o fragmento de código) se conoce en tiempo de
compilación.
LOO: sólo soportan enlace dinámico dentro de la jerarquía de tipos a la
que pertenece toda expresión (identificador o fragmento de código) establecida
en tiempo de compilación.
Lenguaje débilmente tipado
Sí soportan enlace dinámico: el enlace entre variables y tipo (sin
restricciones) se efectúa en tiempo de ejecución (variables se compilan sin
asignarles tipo concreto).
Curso 07-08
8
Indice
1. Motivación y conceptos previos
Signatura y ámbito
Tiempo de enlace
2. Polimorfismo y reutilización
Definición
Tipos de polimorfismo
3. Sobrecarga
Sobrecarga basada en ámbito
Sobrecarga basada en signatura de tipo
Alternativas a la sobrecarga
4. Polimorfismo en jerarquías de herencia
Redefinición
Shadowing
Sobrescritura
5. Variables polimórficas
La variable receptora
Downcasting
Polimorfismo puro
6. Genericidad
Funciones genéricas en C++
Plantillas de clase en C++
Herencia en clases genéricas
Curso 07-08
9
2. Polimorfismo
Definición
Capacidad de una entidad de referenciar distintos elementos
en distintos instantes de tiempo.
El polimorfismo nos permite programar de manera general en lugar
de programar de manera específica.
Hay cuatro técnicas, cada una de las cuales permite una forma
distinta de reutilización de software, que facilita a su vez el
desarrollo rápido, la confianza y la facilidad de uso y mantenimiento.
Sobrecarga
Sobreescritura
Variables polimórficas
Genericidad
Curso 07-08
10
Tipos de polimorfismo
Sobrecarga (Overloading, Polimorfismo ad-hoc): un solo nombre de
método y muchas implementaciones distintas.
Las funciones sobrecargadas normalmente se distinguen en tiempo de
compilación por tener distintos parámetros de entrada y/o salida.
Sobreescritura (Overriding, Polimorfismo de inclusión): Tipo especial
de sobrecarga que ocurre dentro de relaciones de herencia.
En este caso la signatura es la misma (refinamiento o reemplazo del método
del padre) pero los métodos se encuentran en dos clases distintas
relacionadas mediante herencia.
Variables polimórficas (Polimorfismo de asignación): variable que se
declara como de un tipo pero que referencia en realidad un valor de un
tipo distinto.
Cuando una variable polimórfica se utiliza como argumento, la función
resultante se dice que exhibe un polimorfismo puro.
Genericidad (plantillas o templates): forma de crear herramientas
de propósito general (clases, métodos) y especializarlas para situaciones
específicas.
Curso 07-08
11
Tipos de polimorfismo
Sobrecarga
Factura::imprimir()
Factura::imprimir(int numCopias)
ListaCompra::imprimir()
Sobreescritura
Cuenta::abonarInteres()
CuentaJoven::abonarInteres()
Variables polimórficas
Cuenta *pc=new CuentaJoven();
Genericidad
Lista<Cliente>
Lista<Articulo>
Lista<Alumno>
Lista<Habitacion>
Curso 07-08
12
Indice
1. Motivación y conceptos previos
Signatura y ámbito
Tiempo de enlace
2. Polimorfismo y reutilización
Definición
Tipos de polimorfismo
3. Sobrecarga
Sobrecarga basada en ámbito
Sobrecarga basada en signatura de tipo
Alternativas a la sobrecarga
4. Polimorfismo en jerarquías de herencia
Redefinición
Shadowing
Sobrescritura
5. Variables polimórficas
La variable receptora
Downcasting
Polimorfismo puro
6. Genericidad
Funciones genéricas en C++
Plantillas de clase en C++
Herencia en clases genéricas
Curso 07-08
13
3. Sobrecarga (Overloading, polimorfismo ad-hoc )
Un mismo nombre de mensaje asociado a varias implementaciones
La sobrecarga se realiza en tiempo de compilación (enlace estático)
en función de la signatura completa del mensaje.
Dos tipos de sobrecarga:
Basada en ámbito: Métodos con diferentes ámbitos de definición,
independientemente de sus signaturas de tipo. Permitido en todos los
lenguajes OO.
Un mismo método puede ser utilizado en dos o más clases.
P. ej. Sobrecarga de operadores como funciones miembro.
Basada en signatura:Métodos con diferentes signaturas de tipo en el
mismo ámbito de definición. No permitido en todos los lenguajes OO.
P. ej. Cualquier conjunto de funciones no miembro (en el ámbito de definición
global) que comparten nombre.
Dos o más métodos en la misma clase pueden tener el mismo nombre siempre
que tengan distinta signatura de tipos.
Curso 07-08
14
Sobrecarga basada en ámbito
Distintos ámbitos implican que el mismo nombre de método puede
aparecer en ellos sin ambigüedad ni pérdida de precisión.
La sobrecarga por ámbito no requiere que las funciones asociadas con
un nombre sobrecargado tengan ninguna similitud semántica, ni la
misma signatura de tipo.
Ejemplos
¿Son Profesor y Alumno a ámbitos distintos?
¿Y Pers y Profesor?
Carta
Baraja
Pers
+dibuja()
+dibuja(int nMontones=1)
Profesor
Alumno
Maratón
Línea
+getNombre()
Curso 07-08
+getNombre()
+getDistancia()
+getDistancia()
15
Sobrecarga basada en signaturas de tipo
Métodos en el mismo ámbito pueden compartir el mismo nombre
siempre que difieran en número, orden y, en lenguajes con tipado
estático, el tipo de los argumentos que requieren.
Este estilo ocurre en muchos lenguajes funcionales, en algunos imperativos
(e.g. ADA) y en lenguajes OO como C++, C#, Java, Delphi Pascal o CLOS
C++ permite esta sobrecarga de manera implícita siempre que la selección
del método requerido por el usuario pueda establecerse de manera no
ambigua en tiempo de compilación.
Esto implica que la signatura no puede distinguirse sólo por el tipo de retorno
Suma
+add(int a)
+add(int a, int b)
+add(int a, int b, int c)
Curso 07-08
16
Sobrecarga basada en signaturas de tipo
Este modo de sobrecarga en tiempo de compilación puede dar lugar a
resultados inesperados:
class Padre{…};
Comentarios de: Tema 4 - Polimorfismo (0)
No hay comentarios