05/23/2002 Programación Orientada a Objetos. Programación Orientada a Objetos. Iván Bernal, Ph.D. 4

Documentos relacionados
Iván Bernal, PhD 4. Aplicaciones. C, Basic, Fortran. Lenguaje Ensamblador. Hardware. Hardware

Escuela Politécnica Nacional I. Bernal. Iván Bernal, Ph.D. 4

Introducción al Lenguaje "C++"

Programación Orientada a Objetos en C++

Introducción a OOP. Programación Orientada a Objeto

Tema VII POO y lenguajes de programación no Orientados a Objetos (R-1.1)

UAA-DSE Programación 2 / C++ Eduardo Serna-Pérez

HERENCIA Y TIPOS. Articulo. Video Audio Altavoces. Amplificador

Programación Orientada a Objetos

Polimorfismo. Taller III 2007 Gentile,Vazquez

Universidad Nacional del Santa E.A.P. Sistemas e Informática Microcomputación III

Francisco Javier Peña Escobar Universidad del Valle

Tema: Herencia en C#.

Es un conjunto de palabras y símbolos que permiten al usuario generar comandos e instrucciones para que la computadora los ejecute.

Herencia en Java. Agustín J. González Diseño y Programación Orientados a Objetos

2.2 Nombres, Ligado y Ámbito

Tema: Funciones Virtuales y Polimorfismo.

Tema: Funciones Virtuales y Polimorfismo.

UNIVERSIDAD DON BOSCO FACULTAD DE ESTUDIOS TECNOLÓGICOS ESCUELA DE COMPUTACION

Tipos Recursivos de Datos

UNIVERSIDAD DON BOSCO FACULTAD DE ESTUDIOS TECNOLÓGICOS ESCUELA DE COMPUTACION

Manual de referencia de C++ Parte IV Variables Punteros. Preparado por Prof. Luis A. Ortiz Ortiz

LÓGICA DE PROGRAMACIÓN

Programación orientada a objetos

Herencia y polimorfismo

Tema 1. Herencia y Polimorfismo

Tema 6: Clases. Índice

I. Introducción a la programación orientada a objetos y al lenguaje JAVA Colegio Reuven Feuerstein --Javier Navarro

Herencia y Polimorfismo en C++

Miguel López Morales Juan Carlos Ríos Legupín Daniel Ruiz Camacho Diego Sánchez Díaz

PROCEDIMIENTOS ALMACENADOS

Tema: Funciones Virtuales y Polimorfismo.

Principios de Computadoras II

TEMA 0 Gestión de Memoria Dinámica

Tema II: Metodología para la construcción de programas. Profesora: Nelly García Mora

Tipo de Datos Abstractos y Programación Orientada a Objetos

Tema 18: Memoria dinámica y su uso en C

Cristian Blanco

! Fundamentos de la POO. ! Comportamiento y estado. ! Clases y objetos en Java

PRÁCTICA FUNDAMENTOS DE ALGORITMOS I. Objetivos

FACULTAD DE INGENIERÍA

Definición de clase: Una clase es un prototipo que define las variables y los métodos de todos los objetos con características comunes.

Definición de clase: Una clase es un prototipo que define las variables y los métodos de todos los objetos con características comunes.

Tutorial de C# Delegados y Eventos. Por: Óscar López, M.Sc.

Polimorfismo. Métodos virtuales

Formato para prácticas de laboratorio

Guía práctica de estudio 04: Clases y objetos

Esp. Alexis Olvany Torres ch. Datos de salida. Datos de salida. Datos de salida

Conteste las siguientes preguntas:

Edwin Andrés Cubillos Vega

Las clases están compuestas por un conjunto de miembros. (datos y funciones) también se conocen como (atributos y métodos)

INFORMATICA TECNICATURA DE NIVEL SUPERIOR ALGUNOS EJERCICIOS DE SELECCIÓN E ITERACION

PROGRAMACION ORIENTADA A OBJETOS EN C++

Computación Avanzada Clase 3. Mauricio Hidalgo Barrientos

Universidad de Cantabria

Formatos para prácticas de laboratorio

Programación Orientada a Objetos

Punteros y Memoria Dinámica II

Tema: Clases y Objetos en C#. Parte II.

Polimorfismo y Métodos Virtuales. Agustín J. González ELO329

PROGRAMA JAVA SE (Standard Edition) MODALIDAD ONLINE

Accelerating Information Technology Innovation

Cómo implementar tus propias funciones en Lenguaje C?

! Qué es la POO?! Un paradigma de programación. ! No hay paradigmas mejores ni peores! Todos tienen sus ventajas e inconvenientes

Programación orientada a objetos I

Por ejemplo, considerando la jerarquía de herencia de Figuras Geométricas de la siguiente figura, es posible hacer uso del concepto de polimorfismo.

Academia de computación de IE, ICA e ISISA. Unidad didáctica Programación Orientada a Objetos

Algoritmos y Programación Orientada a Objetos I. Contenedoras de tamaño variable y uso de ciclos en otros contextos

Unidad V Análisis Semántico. M.C. Juan Carlos Olivares Rojas

Programación Orientada a Objetos. Resumen de Temas Unidad 3: Constructores y destructores

OOP y C++ Indice. 0.1 Análisis orientado a objetos(1/4) Análisis orientado a objetos(2/4) 0.- OOP 1.- INTRODUCCIÓN.

10 -Herencia Y Polimorfismo. Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas

Fundamentos de Programación

Sistemas Operativos. Iván Bernal, Ph.D. 4. Escuela Politécnica Nacional I.

Tema 8 Gestión de la memoria en tiempo de ejecución.

Contenido. Prefacio Orígenes de la programación orientada a objetos... 1

Capítulo 3. Subprogramas. 3.1 Subprogramas FUNCTION

Sistemas Operativos. Curso 2017 Administración de memoria I

Programación Orientada a Objetos. Conceptos Básicos

Unidad Didáctica 5: Introducción a la Programación Orientada a Objetos

TEMA 1. PROGRAMACIÓN DE UN COMPUTADOR

Evolución del software y su situación actual

Programación Orientada por Objetos. Prof. Yudith Cardinale Universidad Simón Bolívar Dpto de Computación y Tecnología de la Información

Guías técnicas Grupo Danysoft: Creación de Componentes en Delphi (parte II)

ProgramaciónDeclarativa

ALGORITMICA Y PROGRAMACION POR OBJETOS I

2.1 METODOLOGÍA PARA LA SOLUCIÓN DE PROBLEMAS

Unidad V. Ya veremos qué poner en "algunas_palabras" y "algo_más", por ahora sigamos un poco más.

Temas. Taller III 2007 Gentile,Vazquez

Programación C++ (5 Parte) Dr. Oldemar Rodríguez Rojas Escuela de Informática Universidad Nacional

ARQUITECTURA BÁSICA DEL ORDENADOR: Hardware y Software. IES Miguel de Cervantes de Sevilla

Para crear un arreglo de cualquier tipo de elementos la sintaxis es:

ALGORITMICA Y PROGRAMACION REPÚBLICA BOLIVARIANA DE VENEZUELA MINISTERIO DEL PODER POPULAR PARA LA EDUCACIÓN UNIDAD EDUCATIVA COLEGIO MICAELIANO

Objetos y memoria dinámica

Curso Programación Java JSE 7

Programación Avanzada CONCEPTOS BÁSICOS DE IMPLEMENTACIÓN EN C++

Siguiente >>>>> Radicación

PROGRAMACIÓN DE COMPUTADORES II SEMANA 2 ESTE DOCUMENTO CONTIENE LA SEMANA 2

Un diagrama de flujo es un dibujo que utiliza símbolos estándar de diagramación de algoritmos para computadora, en el que cada paso del algoritmo se

Programación Orientada a Objetos. Integrantes: Santiago Hernández Bolívar Edwin Alexander Bohórquez

Transcripción:

Programación Orientada a Objetos Clase # 7 Polimorfismo Jueves, 23 de Mayo de 2002 Agenda Polimorfismo. Operadores new y delete Iván Bernal, Ph.D. Escuela Politécnica Nacional email: imbernal@mailfie.epn.edu.ec Copyright @2002, I. Bernal Iván Bernal, Ph.D. 2 Polimorfismo (1) Con una jerarquía de tipos, suele ser conveniente manipular un objeto utilizando el tipo de la base y no el tipo específico. Se puede escribir código que no depende de un tipo específico. Ejemplo con las formas geométricas: Se puede escribir código que manipule las formas de manera genérica sin considerar si son círculos, cuadrados, triángulos, etc. Toda forma requiere ser dibujada, borrada y movida. El código que las manipula simplemente envía mensajes a un objeto Forma Geométrica, no se preocupa como cada objeto se encarga de manejar el mensaje. Iván Bernal, Ph.D. 3 Polimorfismo (2) Código como el descrito no se verá afectado por la inclusión de nuevos tipos. Añadir nuevos tipos es la manera más común de extender un programa que use POO, para resolver nuevas demandas del programa. Se podría derivar un nuevo tipo: Pentágono sin modificar aquella parte del código que manipula las forma genéricas. Este tipo de facilidad mejora los diseños al mismo tiempo que reduce los costos de mantenimiento del software. Iván Bernal, Ph.D. 4

Polimorfismo (3) Problema: Si una función por ejemplo, comanda que una forma genérica se dibuje, o a un ave genérica que vuele, el compilador no sabe con precisión, el momento de la compilación, la sección de código que se va a ejecutar. Pero eso es lo que quiere el programador, cuando se envíe el mensaje, no quiere saber cuál será el código que se ejecutará. El comando para dibujar una forma geométrica se aplica por igual a un círculo, a un cuadrado, a un triángulo, y el código a ejecutarse dependerá del tipo específico del objeto. Al no conocer la sección exacta de código a ejecutarse, se puede añadir tipos y el código a ejecutarse para este nuevo tipo será diferente, sin necesidad de hacer cambios a la función que comanda las operaciones del tipo genérico. Iván Bernal, Ph.D. 5 Polimorfismo (4) En la figura se tiene un controlador (BirdController) de objetos tipo pájaro (Bird). El controlador no sabe el tipo específico de los objetos tipo pájaro. Para el BirdController esto es conveniente ya que no necesita escribir código para primero descubrir que tipo de objeto se usará en un determinado momento. Cuando se invoque la función move( ), sin conocer el tipo específico de Bird,, el comportamiento adecuado para cada objeto será ejecutado (un ganso Goose- corre, vuela o nada y un pingüino Penguin- corre o nada. Iván Bernal, Ph.D. 6 Polimorfismo (5) Polimorfismo (6) Cómo se consigue lo mencionado en el ejemplo? La respuesta es uno de los trucos fundamentales utilizados en POO. El compilador de un lenguaje tradicional, cuando se llama a una función se produce lo que se conoce como asociación temprana (early binding). El compilador genera una llamada usando el nombre de una función específica, y el enlazador (linker) resuelve la llamada e incluye la dirección del código que va a ser ejecutado. En POO, no se puede determinar la dirección del código a ejecutarse sino hasta que el programa esté en ejecución. Iván Bernal, Ph.D. 7 Iván Bernal, Ph.D. 8

Polimorfismo (7) Lenguajes OO utilizan el concepto de asociación tardía (late binding). Cuando se envía un mensaje a un objeto, el código llamado no se determina hasta que el programa está en ejecución. En C++, el compilador inserta una sección de código en lugar de una llamada absoluta a una función. Este código calculará la dirección del cuerpo de la función, utilizando información almacenada en el objeto que se invoque. Iván Bernal, Ph.D. 9 Polimorfismo (8) Para indicar que se desea que una función de una clase tenga la flexibilidad de late-binding, se utiliza la palabra clave virtual. No es necesario entender en detalle los mecanismos detrás de esta palabra, pero sin ella no se puede hacer POO en C++. Las funciones virtuales permiten expresar diferencias en el comportamiento de objetos de clases de una misma jerarquía. Iván Bernal, Ph.D. 10 Polimorfismo (9) Polimorfismo (10) Para demostrar la idea de polimorfismo, se usa la jerarquía de clases de la figura y se presenta código que utiliza la clase base y no se interesa de los detalles de los otros tipos. Si un nuevo tipo digamos Hexagon es añadido con herencia, el código presentado también trabajará. Iván Bernal, Ph.D. 11 Iván Bernal, Ph.D. 12

Polimorfismo (11) void HacerAlgo(Shape& s) { s.erase(); //... s.draw(); } Esta función manipula cualquier objeto Shape: : es decir, es independiente del tipo específico del objeto que se pase como referencia en la función. Polimorfismo (12) En algún lugar e nuestro programa se utilizará la función HacerAlgo() (): Circle c; Triangle t; Line l; HacerAlgo(c); HacerAlgo(t); HacerAlgo(l); Iván Bernal, Ph.D. 13 Iván Bernal, Ph.D. 14 Polimorfismo (13) Considerando la línea: HacerAlgo() (); Un objeto Circle se pasa como argumento a una función que espera un Shape. Puesto que un Circle es un Shape, el círculo puede tratarse como un Shape dentro de HacerAlgo( ). Cualquier mensaje que HacerAlgo() puede enviar a un Shape,, puede ser aceptado por un Circle. Iván Bernal, Ph.D. 15 Polimorfismo (14) En la función HagaAlgo(), se tiene las líneas: s.erase(); //... s.draw(); Debe notarse que no dice si s es un círculo (Circle) haga tal cosa, y si s es un cuadrado (Square) Square),, haga esta otra, etc. Escribir código que cheque por todos los tipos que pueden pasar como Shape, puede ser complicado y confuso y debe ser alterado cada vez que se añada un nuevo tipo Shape. Iván Bernal, Ph.D. 16

Polimorfismo (15) En el ejemplo se asume que cualquier objeto pasado como argumento es del tipo Shape,, y cada uno sabe como erase( ) y draw( ),, y sabe como manejar los detalles de la operación. Lo impresionante del código en HagaAlgo( ) es que de algún modo, se obtiene el comportamiento deseado. Invocando draw( ) para Circle hace que diferente código se ejecute comparado con cuando se invoca draw( ) para un Square ó un Line. Al enviar el mensaje draw( ) al objeto anónimo Shape,, se invoca el código específico basado en el tipo real de Shape. Polimorfismo (16) Esto es muy interesante ya que, como se mencionó, el compilador no puede saber exactamente el tipo con el cual estará trabajando. De forma intuitiva se podría pensar que se llamen las versiones de erase( ) y draw( ) pero de Shape,, y no las versiones específicas de Circle, Square,, o Line. Sin embargo, el comportamiento adecuado se tiene gracias al Polimorfismo. El compilador y el sistema de soporte del lenguaje al tiempo de ejecución se encargan de los detalles. Iván Bernal, Ph.D. 17 Iván Bernal, Ph.D. 18 Polimorfismo (17) Lo que el programador necesita saber es que polimorfismo está presente y disponible. Sobre todo el programador debe saber como diseñar usando Polimorfismo. Si una función es virtual,, cuando se envíe un mensaje a un objeto, de alguna forma el objeto hará la cosa correcta. Creación y destrucción de objetos (1) Técnicamente, el dominio de la POO es la introducción de tipos de datos abstractos, herencia y polimorfismo, pero existen otros aspectos importantes a revisarse. Construcción y destrucción de objetos. En donde están los datos de un objeto? Cómo se controla el tiempo de vida de un objeto? Iván Bernal, Ph.D. 19 Iván Bernal, Ph.D. 20

Creación y destrucción de objetos (2) C++ ofrece dos alternativas: El almacenamiento y tiempo de vida de un objeto puede determinarse el momento de la compilación, se ubican los objetos en el stack ó almacenamiento estático. Las variables en el stack se denominan automáticas (automatic) ó de alcance determinado (scoped). El área de almacenamiento estático es una sección de memoria que se reserva antes de que el programa inicie su ejecución. Creación y destrucción de objetos (3) Usar las dos opciones ayuda a obtener menores tiempos de ejecución del programa en ciertas tareas, pero se pierde flexibilidad. Se debe saber el número exacto, el tiempo de vida y el tipo de los objetos, al momento de escribir el programa. Iván Bernal, Ph.D. 21 Iván Bernal, Ph.D. 22 Creación y destrucción de objetos (4) La segunda opción es crear objetos dinámicamente en un área de memoria llamada heap. No se conoce sino hasta el tiempo de ejecución del programa cuantos objetos se necesitan, cuál es su tiempo de vida y cual es su tipo exacto. Si se necesita un objeto adicional, se lo construye en el heap,, utilizando la palabra clave new.. Cuando no se requiere más un objeto y se desea liberar el almacenamiento asociado, se desecha el objeto utilizando la palabra clave delete. Creación y destrucción de objetos (5) Debido a que la reserva del almacenamiento se lo realiza dinámicamente durante la ejecución del programa, el tiempo requerido para reservar espacio en el heap es mucho mayor que si se ubicaran los objetos en el stack. Pero se obtiene mayor flexibilidad, esencial para resolver algunos problemas de programación. Cuando se crea el objeto en el heap,, el compilador no sabe el tiempo de vida del objeto. En C++, es tarea del programador determinar cuando debe destruirse un objeto, utilizando delete. Iván Bernal, Ph.D. 23 Iván Bernal, Ph.D. 24