PDF de programación - Tema 4 - Polimorfismo

Imágen de pdf Tema 4 - Polimorfismo

Tema 4 - Polimorfismográfica de visualizaciones

Publicado el 24 de Junio del 2017
583 visualizaciones desde el 24 de Junio del 2017
1,2 MB
113 paginas
Creado hace 12a (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{…};
  • Links de descarga
http://lwp-l.com/pdf4584

Comentarios de: Tema 4 - Polimorfismo (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios
Es necesario revisar y aceptar las políticas de privacidad