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)))