Reutilización con Delegación y Herencia

Documentos relacionados
Reutilización con Delegación y Herencia

Reutilización con delegación, herencia y polimorfismo

A3F. Polimorfismo. Carlos Fontela

A3F. Polimorfismo. Carlos Fontela

POO en lenguajes compilados de tipos estáticos (Java y C#)

Herencia. Implementación en Java

A3F. Objetos (uso) Carlos Fontela

Programación orientada a objetos. Resumen de Temas Unidad 5: Herencia

Clases (construcción)

Curso de Java POO: Programación orientada a objetos

TEMA 5. Agenda. Herencia

Curso de Java POO: Programación orientada a objetos

UNIDAD 4 IMPLEMENTACION DE PROPIEDADES DE LOS OBJETOS JAVA

A3F. Objetos (uso) Carlos Fontela

Taller de Programación I. Tema 10: Herencia en Java

Programación orientada a objetos

acceso Implementación de conceptos P.O.O. en Java Orientada a Objetos 2. Modificadores de en Java Temario

Clases (construcción)

Introducción a la Orientación a Objetos

HERENCIA (2ª parte) En Java todas las clases derivan de otra, aunque no se diga explícitamente.

Derechos de Acceso: COMPOSICION

Tema 5. Herencia. Departamento de Lenguajes y Sistemas Informáticos Universidad de Granada

Programación. Orientada a Objetos. Prof. Angela Di Serio. Universidad Simón Bolívar Especialización en Telemática

Programación Orientada a Objetos. Conceptos Básicos

Tema 3 Herencia en Java Parte 2. Programación Orientada a Objetos Curso 2015/2016

Principios de Computadoras II

Unidad 2. Elementos Intermedios del Lenguaje

Tema 3 Herencia en Java Parte 2. Programación Orientada a Objetos Curso 2015/2016

POO: Clases y objetos

Unified modeling language

Excepciones UML Cuestiones conceptuales

CLASE 9 -HERENCIA Y POLIMORFISMO

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

Conceptos Básicos. Programación Orientada a Objetos 2

Examen Teórico Convocatoria de Junio de 2012

UNIVERSIDAD AUTÓNOMA DE CHIAPAS LICENCIATURA EN SISTEMAS COMPUTACIONALES

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

Programación orientada a objetos. Introducción

Abstracción. Encapsulamiento. Polimorfismo. Objeto. método / objeto / clase / módulo. Separación de las propiedades de un

IMPLEMENTACIÓN DE CONCEPTOS P.O.O. EN JAVA

Herencia. Proceso mediante el cual una clase adquiere las propiedades (atributos) y comportamiento (métodos) de otra.

Tema 6 Patrones de Diseño. Programación Orientada a Objetos Curso 2010/2011

Programación Dirigida a Objetos. MATERIAL COMPLEMENTARIO Tema 5.- Herencia

Tema 1. Herencia y Polimorfismo

Objetivos. Objetivos. Herencia. Objetivos. agregar funcionalidad a una clase existente, sin compilar su nueva definición.

Fundamentos de Programación

Introducción a Java. Fernando Cerezal López. 24 Noviembre 2005

Universidad Salesiana de Bolivia

Clases y herencia. FJP Unidad 8. Diseño de clases

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

Tema 10: Interfaces. Índice

PROGRAMACIÓN ORIENTADA A OBJETOS 1/7/2009. Examen de Java. Nombre: DNI: Titulación:

Examen Teórico. Convocatoria de Febrero de 2015

Interfaces. Amparo López Gaona. Septiembre de Amparo López Gaona () Interfaces Septiembre de / 1

Relaciones entre clases

Contenido. 1 Qué es un diagrama de clase? 2 Elementos de un diagrama de clase. 3 Clase, atributo, método y visibilidad. 4 Agregación y composición

Tema 3 Herencia en Java Parte 1. Programación Orientada a Objetos Curso 2015/2016

Objeto Clase Atributo / Método Encapsulamiento Mensaje Herencia Polimorfismo Encadenamiento Dinámico

RTTI y reflexión A3F. Carlos

Aplicaciones de Escritorio

Tema 2: Programación basada en Objetos

Examen Teórico. Convocatoria de Febrero de 2018

Qué es Java? Un lenguaje de programación Un entorno de desarrollo Un entorno de aplicación Un entorno de despliegue Es similar en sintaxis de C + +.

Unidad IV. Este tipo de codificación nos es permitido gracias a la sobrecarga, la cual se aplica a métodos y constructores.

CONCEPTO DE INTERFACE Y HERENCIA MÚLTIPLE EN JAVA. IMPLEMENTS. EJEMPLOS Y DIAGRAMAS DE CLASES. (CU00696B)

Curso Fundamentos de Informática Lección 7. Programación Orientada a Objetos

INICIACIÓN A LA PROGRAMACIÓN LENGUAJE JAVA con BlueJ

POO: Herencia. Programación de aplicaciones. Jesus Barron Vidales 7/05/10

PROGRAMACIÓN EN JAVA

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

12. Tipos de atributos

Guía práctica de estudio 07: Herencia

UML: Diagrama de Clases

Introducción a la Orientación a Objetos

Diseño y Programación Orientados a Objetos 29 de Abril de Primer Certamen

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

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

3.1 Introducción a TDA y OO. Capítulo III. Tipos de Datos Abstractos, Orientación a Objetos y Lenguaje Java

La Herencia: Teoría (1)

Tema 3: Herencia en C# Programación Orientada a Objetos Curso 2008/2009 Begoña Moros Valle

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

Programación Tema 7: Relaciones entre clases. Programación DIT-UPM

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

Clases abstractas e interfaces en Java

Metodologías en la Ingeniería del Software Métodos Orientados a Objetos

Tema: Funciones Virtuales y Polimorfismo.

Herencia. Hay clases que comparten gran parte de sus características.

PNFSI. Asignatura: Desarrollo de Software. Tema 1: Programación Orientada a Objetos

PROGRAMACIÓN EN C#.NET Programación Orientada a Objetos en C# Ing. Bruno López Takeyas

Tema 3. Herencia. Programación Avanzada. Jorge Badenas

Héctor Cuadra. Diseño de Sistemas de Información

Concurso: Cuánto sabes de JAVA?

Conceptos. ELO329: Diseño y Programación Orientados a Objetos. ELO 329: Diseño y Programación Orientados a Objetos 1

Contenidos. Técnicas de POO. Abstracción. Abstracción. Programación Orientada a Objetos Facultad de Informática

Guía del Curso IFCD052PO PROGRAMACIÓN EN JAVA

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

Guía práctica de estudio 08: Polimorfismo

Tema 1.- Conceptos básicos de la OO

Conceptos de Programación Orientada a Objetos

Transcripción:

Reutilización con Delegación y Herencia Carlos Fontela cfontela@fi.uba.ar

Temario Delegación Herencia UML: clases, paquetes, secuencias Cuándo usar herencia y cuándo delegación Redefinición Clases abstractas 2c2009 2

Mecanismos de abstracción (1) Clasificación (individuo-especie) Lassie perro / Juan Pérez ser humano En OO: instanciación (objeto-clase) 2c2009 3

Mecanismos de abstracción (2) Agrupación (entre individuos) Auto - rueda En OO: agregación (objeto-objeto) 2c2009 4

Generalización (entre especies) Lápiz herramienta de escritura Animal ser vivo En OO: herencia (clase-clase) Mecanismos de abstracción (3) 2c2009 5

Delegación (1) Un objeto contiene referencias a otros objetos y les delega comportamiento public class Segmento { private Punto p1; private Punto p2;... } 2c2009 6

Delegación (2) Es una forma de reutilización Mediante el envío de un mensaje a otro objeto El otro objeto se preocupa de cómo implementa el método Evitar los objetos omnipotentes 2c2009 7

Agregación vs. Composición Composición Las partes no son independientes del todo El objeto contenido no puede estar contenido en más de un contenedor Eliminación del todo implica la de las partes Rombo lleno en UML 2c2009 8

Clases en UML Ventana -posicion : Object -colorfondo : int -ancho : int -alto : int -titulo : String #owner : Ventana +Mover() +Dibujar() +Borrar() Pedido 1 * 1 Cliente * +Artículos de línea LineaDePedido 2c2009 9

Paquetes en UML Modelo Vista Controlador 2c2009 10

Diagrama de secuencias UML 2c2009 11

Ejercicio En un banco existen varios mostradores. Cada mostrador puede atender cierto tipo de trámites y tiene una cola de clientes, que no puede superar un número determinado para cada cola. Además hay una cola general del banco en la cual se colocan todos los clientes cuando las colas de los mostradores están completas. Cada cliente concurre al banco para realizar un solo trámite. Un trámite tiene un horario de creación y un horario de resolución. Se pide: 1) Implementar el método mostrador.atiende(untramite), que devuelve true o false indicando si el tramite se puede atender o no en el mostrador; note que el tipo de trámite correspondiente a untramite tiene que coincidir con alguno de los tipos de trámite que atiende el mostrador. 2c2009 12

2) Implementar el método banco.mostradoresqueatienden(untramite), que retorna la colección de todos los mostradores que atienden ese trámite. 3) Implementar el método banco.mejormostradorpara(untramite), que retorna el mostrador con la cola más corta con espacio para al menos una persona más y que atienda ese trámite; si ningun mostrador tiene espacio, retorna null. 4) Implementar el método banco.atender(uncliente); cuando llega un cliente al banco se lo ubica en el mostrador que atienda el trámite que el cliente requiere, que tenga espacio y la menor cantidad de clientes esperando; si no hay lugar en ningún mostrador el cliente debe permanecer en la cola general de espera del Banco. 5) Implementar el método mostrador.atenderprimero(); debe desencolar al primer cliente de la cola y atender su trámite, lo cual implica asignarle la hora de resolución al trámite del cliente. 6) Implementar el método banco.siguienteclientepara(unmostrador); debe elegir de la cola general del banco, el primer cliente que necesite realizar un trámite que unmostrador pueda atender; si no existe tal cliente el método retorna nil. 2c2009 13

Solución 2c2009 14

2c2009 15

Taxonomías (I) Relaciones es un 2c2009 16

Taxonomías (II) 2c2009 17

Taxonomías (III) Observamos Las clasificaciones no tienen por qué ser completas, pero sí excluyentes Algunas de las clases del árbol pueden no tener instancias: clases abstractas La ubicación de una clase en la jerarquía se establece por la relación es un Cada clase hereda comportamiento y estructura de su ancestro 2c2009 18

Reutilización Usar clases en una aplicación diferente a que motivó su primer uso, tal como están? Es el uso simple de clases No se lo llama reutilización Extensión: Usar clases como base para la creación de otras nuevas con comportamiento parecido Delegación Herencia No necesitamos el código fuente 2c2009 19

Herencia y lenguajes En Java, para indicar herencia public class Elipse extends Figura {... } En C# reemplazamos extends por : Elipse tiene, por lo menos: los mismos atributos de Figura los mismos métodos de Figura puede agregar atributos y métodos puede redefinir métodos 2c2009 20

Herencia, variables y objetos Casteo hacia arriba automático Elipse e = new Elipse(); Figura f = e; // válido y seguro // e = f; inválido e inseguro Otro caso public void p (Figura x) { } // luego será invocado: p(e);// e es de tipo Elipse Los llamamos objetos polimorfos Parecen una cosa pero son otra f es una Elipse aunque se la trate como Figura Figura f = new Elipse ( ); // tipos distintos en la variable y el objeto!! 2c2009 21

Herencia y colecciones O colecciones polimorfas Pero public Figura[ ] v = new Figura [3]; // luego v[0] = new Elipse ( ); v[1] = new Circulo ( ); v[2] = new TrianguloRectangulo ( ); Estamos perdiendo información del objeto Cada v[i] sólo va a tener disponibles los atributos y métodos públicos de Figura Ya volveremos sobre esto 2c2009 22

Particularidades de los lenguajes Jerarquía de raíz única (Java, C#, Smalltalk) Clase Object Todo se puede transformar en un Object Atributos y métodos comunes a todas las clases Otras importantes consecuencias Posibilidad de evitar la herencia (Java, C#) Declaramos la clase como final Ejemplo: String public final class String {...} sealed en C# 2c2009 23

Más sobre visibilidad Atributos y métodos protegidos (protected) Son visibles sólo para las clases descendientes y las del propio paquete Poco uso; riesgos Clases con visibilidad de paquete Sólo se pueden usar dentro de su paquete Clases privadas? Sólo cuando son clases internas No hay clases protegidas 2c2009 24

Constructores Los constructores no se heredan Cada clase debe tener el suyo Receta Llamar al constructor del ancestro al principio del constructor propio // Java: public Derivada( ) { super();... } // C#: public Derivada( ) : base ( ) {... } Automático con constructores por defecto 2c2009 25

Redefinición (1) Se puede volver a definir un método en una clase descendiente: 2c2009 26

Redefinición (2) Debe preservar la semántica (significado) Obligatoria Si la implementación debe ser diferente Caso de extraer en CuentaBancaria Optativa Razones, en general, de eficiencia Caso de longitud de Elipse Los métodos deben tener la misma signatura 2c2009 27

Redefinición en Java y C# Los métodos privados no pueden ser redefinidos Se estaría definiendo uno nuevo Posibilidad de evitar la redefinición Métodos final public final void m() {...} sealed en C# No se puede redefinir un método haciéndolo más privado Sobrecarga y redefinición Redefinición se hace con la misma firma Si no, es sobrecarga 2c2009 28

Herencia y diseño por contrato Precondiciones de métodos No pueden ser más estrictas en una subclase de lo que son en su ancestro Postcondiciones de métodos No pueden ser más laxas en una subclase de lo que son en su ancestro Invariantes de clase Deben ser al menos los mismos de la clase ancestro Excepciones Un método debe lanzar los mismos tipos de excepciones que en la clase ancestro, o a lo sumo excepciones derivadas de aquéllas 2c2009 29

Delegación vs. Herencia (1) Herencia: relación es un Composición/agregación: contiene hace referencia es parte de Mito: en POO todo es herencia Mal ejemplo: Stack en Java 1.0/1.1 una pila no es un vector! Herencia si se va a reutilizar la interfaz Stack es un mal ejemplo 2c2009 30

Delegación vs. Herencia (2) Herencia Cuando se va a reutilizar la interfaz Delegación Cuando se va a reutilizar el estado 2c2009 31

Herencia múltiple (C++, otros) Las clases dejaron de ser excluyentes 2c2009 32

Clases abstractas No tienen instancias Caso de CuentaBancaria si implemento CajaAhorro Pero pueden tener constructor que no debe ser llamado nunca! Generalizan estructura y comportamiento de varias clases Caso del método mover O crean una familia En Java y C#: Se declara abstract 2c2009 33

Ejercicio: círculos y elipses Suponga que tiene una clase Elipse, que implementa la siguiente interfaz para una elipse no girada : public interface ElipseI { Punto getcentro ( ); double getradiox ( ); double getradioy ( ); void cambiarescala (double factorx, double factory); void movercentro (Punto nuevocentro); } Implemente una clase Circulo: a. Usted sabe que todo círculo es una elipse, por lo que desearía utilizar herencia para implementar Circulo. Ve algún problema? Suponga que puede modificar la interfaz ElipseI, y la clase Elipse, le permite esto solucionar el problema? Muéstrelo en código y en diagrama de clases. b. Suponga que no tiene manera de cambiar la clase Elipse. Se le ocurre otra idea, aunque sea sin usar herencia? Muéstrelo en código y en diagrama de clases. 2c2009 34

Solución? Ver http://cysingsoft.wordpress.com/2009/04/27/sobr e-el-circulo-y-la-elipse-carlos-fontela/ 2c2009 35

Claves Herencia para relaciones es un Composición para relaciones es parte de Redefinición permite cambiar implementación manteniendo la semántica Clases abstractas no tienen instancias 2c2009 36

Lectura obligatoria Apunte de Pruebas (ver sitio de la materia) 2c2009 37

Lecturas optativas Object-oriented analysis and design : with applications, Grady Booch Capítulo 3: Classes and Objects Análisis y diseño orientado a objetos, James Martin y James Odell Capítulo 16: Administración de la complejidad de un objeto Ambos libros están en biblioteca El de Booch tiene una versión en castellano, agotada Son libros antiguos Más de 15 años No existía Java ni C#, sí Smalltalk Orientación a objetos, diseño y programación, Carlos Fontela 2008, capítulos 4 y 5 Delegación y Herencia de implementación UML gota a gota, Martin Fowler, capítulos 4, 5, 6 y 7 2c2009 38

Qué sigue Polimorfismo Smalltalk Excepciones Colecciones e iteradores 2c2009 39