Puntos importantes Tipos de datos Beneficios Interfaces

Anuncio
Puntos importantes
Lenguajes y
Paradigmas de
Programación
Clase 16
Tema 8: Construcción de tipos de datos
•
•
Tipos de datos, interfaces y polimorfismo
•
Implementación del polimorfismo con
Tipos de datos
•
Un tipo de datos agrupa un conjunto de
fuciones y de datos
•
Necesitamos un conjunto de funciones que
implementen una barrera de abstracción y
que hagan de constructores y selectores
•
Encapsulación de la información
Interfaces
• Una interfaz está definida por un conjunto
de funciones
• En algunos lenguajes de POO (Java, por
La interfaz Vector (geometría) y sus
implementaciones
•
•
•
Selección de código con datos etiquetados
Programación dirigida por los datos
Paso de mensajes
Beneficios
•
Los ya vistos, relacionados con la abstracción:
ocultación de la información, definir barreras
de abstracción, acercan el programa al
dominio que se está programando
•
En los lenguajes tipeados se declara el tipo
de las variables: esto permite detectar errores
en tiempo de compilación, autocompletar el
código en los IDE de programación, mejorar
la legibilidad de los programas
Polimorfismo en Java (1)
public interface Animal {
public String juega();
public String avanza();
}
public class Perro implements Animal {
private String nombre;
ejemplo) se permite definir por separado la
interfaz y definir distintas implementaciones
public String juega() {
return "¡Guau, guau!";
}
public String avanza() {
return "Mira, estoy corriendo";
}
• Esto da lugar al polimorfismo
}
Polimorfismo en Java (2)
public class Pajaro implements Animal {
private String nombre;
public String juega() {
return "¡Pio, pio!";
}
public String avanza() {
return "Mira, estoy volando";
}
Polimorfismo en Java (3)
public class Main {
public static void main(String[] args) {
Animal d = new Perro();
d.juega();
d.avanza();
}
}
¿A qué métodos se llaman?
¿Cómo se sabe que d es un
Perro si está declarado cómo
Animal?
}
Polimorfismo en Java (4)
public class Main {
public static void main(String[] args) {
Animal d = new Perro();
d.juega();
d.avanza();
}
}
Polimorfismo en Java (5)
•
Algunas de sus ventajas: eleva el nivel de
abstracción de los programas, permite ampliar
fácilmente el código, permite separar
claramente la implementación de la definición
•
Ejemplos en Java: colecciones, entrada/salida, ...
Collection<Animal> animales;
Iterador it = animales.getIterator();
while (it.hasNext()) {
miAnimal = next();
miAnimal.juega();
miAnimal.avanza();
}
El objeto referenciado por d
conoce su propio tipo y llama a
su propia implementación.
Se realiza en tiempo de
ejecución.
Polimorfismo en
Scheme
Polimorfismo
•
Existe polimorfismo en una llamada cuando el
código real que se va a ejectuar depende del tipo
de datos del objeto implicado
•
Se puede encontrar en lenguajes funcionales,
orientados a objetos e imperativos
•
•
No confundir con la sobrecarga
En C++ se consigue un método polimórfico
marcándolos como "virtual" (consultar la URL:
http://www.glenmccl.com/virt_cmp.htm)
•
•
Tres formas de implementarlo
Selección de código con datos etiquetados
Programación dirigida por los datos
Paso de mensajes
•
•
•
Conceptos previos
Ejemplo: vectores gráficos con 2
implementaciones
Datos etiquetados
•
•
Vectores gráficos
Conversión
• Vector polar a vector cartesiano
x = mod * cos(alfa)
y = mod * sin(alfa)
• Vector cartesiano a vector polar
• Representación cartesiana: (x,y)
• Representación polar: (mod, !)
mod = sqrt (x^2 + y^2)
alfa = atan(y,x)
Implementación
cartesiana
Interfaz
" (make-from-x-y-vector x y)
" (make-from-mod-ang-vector mod ang)
" (x-vector v)
" (y-vector v)
" (mod-vector v)
" (ang-vector v)
¡Polimorfismo!
Implementación polar
!
!
!
!
!
!
"! (make-from-x-y-polar x y)
"! (make-from-mod-ang-polar mod ang)
"! (x-polar v-polar)
"! (y-polar v-polar)
"! (mod-polar v-polar)
"! (ang-polar v-polar)
!
!
!
!
!
!
"! (make-from-x-y-cart x y)
"! (make-from-mod-ang-cart mod ang)
"! (x-cart v-cart)
"! (y-cart v-cart)
"! (mod-cart v-cart)
"! (ang-cart v-cart)
Datos etiquetados
(define (attach-tag type-tag contents)
(cons type-tag contents))
(define (type-tag datum)
(if (pair? datum)
(car datum)
(error "error en type-tag" datum " no es un dato etiquetado")))
(define (contents datum)
(if (pair? datum)
(cdr datum)
(error "error en contents" datum " no es un dato etiqueteado")))
Implementación
(define (make-from-x-y-cart x y)
(attach-tag 'cart (cons x y)))
(define (make-from-mod-ang-cart mod ang)
(attach-tag 'cart
(cons (mod-ang->coor-x mod ang)
(mod-ang->coor-y mod ang))))
• Cargamos las dos implementaciones en
Scheme y probamos a crear distintos tipos
de vectores y a llamar a sus métodos
(define (x-cart v) (car v))
(define (y-cart v) (cdr v))
(define (mod-cart v)
(xy->modulo (x-cart v)
(y-cart v)))
(define (ang-cart v)
(xy->angulo (x-cart v)
(y-cart v)))
(define (make-from-x-y-polar x y)
(attach-tag 'polar
(cons (xy->modulo x y)
(xy->angulo x y))))
(define (make-from-mod-ang-polar mod ang)
(attach-tag 'polar (cons mod ang)))
(define (mod-polar v) (car v))
(define (ang-polar v) (cdr v))
(define (x-polar v)
(mod-ang->coor-x (mod-polar v) (ang-polar v)))
(define (y-polar v)
(mod-ang->coor-y (mod-polar v) (ang-polar v)))
Descargar