Herencia y Clases Abstractas Reutilización de código y código genérico ELO329: Diseño y Programación Orientados a Objetos.

Slides:



Advertisements
Presentaciones similares
Ayudantía Pre-Actividad 5 Multimedios. Ayudantía Pre-Actividad 5 (1) creación de varias clases, y composición (2) manejo de threads (3) manejo de excepciones.
Advertisements

Curso de java básico (scjp)
FUNDAMENTALS OF THE JAVA PROGRAMMING LANGUAGE
Curso de Java Capitulo 7: Continuación Poo Profesor:
Definición de Clases y Variables de referencia.
POLIMORFISMO UNIDAD 4.
Lenguaje de programación Java
Clases Extendidas La clase extendida hereda los campos y métodos de la clase de la cual extiende. La clase original se conoce como superclase y la clase.
Arquitectura CLARO-TECNOTREE
Herencia y Polimorfismo
Aplicación del paradigma orientado a objetos
Diseño y programación de
PROGRAMACION ORIENTADA A OBJETOS
HERENCIA.
Herencia e Interfaces.
Medio de tele-comunicación
Polimorfismo Lenguajes de Programación II Corporación Universitaria del Caribe CECAR.
Introducción a Java II.
Lic. Rosemary Torrico Bascopé
Clases y objetos La unidad fundamental de programación OO son las clases. Conjunto de métodos y semántica Qué se va a hacer POO Clase: que define la implementación.
1 Herencia en Java Agustín J. González Diseño y Programación Orientados a Objetos.
UNIDAD 2 CLASES Y OBJETOS. CLASE Elementos cabecera y cuerpo de la clase. Cabecera: aporta información fundamental sobre la clase en sí y constituye de.
Jerarquía de Clases: Herencia, Composición y Polimorfismo
SCJP SUN CERTIFIED PROGRAMMER FOR JAVA 6. SEMANA DOS ORIENTACION A OBJETOS.
ELO-329: Diseño y Programación Orientados a Objetos 1 Conceptos ELO329: Diseño y Programación Orientados a Objetos.
Herramientas de polimorfismo y herencia en C++
Manejo de Punteros y objetos en memoria dinámica en C++
Metodología de Programación Ayudantía 4 lelagos.ublog.cl 2008.
UNIDAD VI Recursos esenciales de Java LSC. Natalia Rodríguez Castellón.
SCJP SUN CERTIFIED PROGRAMMER FOR JAVA 6
Metodología de Programación Ayudantía 5 lelagos.ublog.cl 2009.
Interfaces y Clases Internas ELO329: Diseño y Programación Orientados a Objetos.
Interfaces ELO329: Diseño y Programación Orientados a Objetos.
1 Herencia en Java Agustín J. González Diseño y Programación Orientados a Objetos.
Clases y Objetos en Java ELO329: Diseño y Programación Orientados a Objetos.
Herencia. Introducción La idea básica es poder crear clases basadas en clases ya existentes. Cuando heredamos de una clase existente, estamos re-usando.
Unidad 2.1: INTRODUCCIÓN A LA ORIENTACIÓN A OBJETOS.
Programación orientada a objetos
Interfaces y Clases Internas
:: Prof. Yeniffer Peña Programación I Programación Orientada a Objetos Presentación.
Herencia y Clases Abstractas
Programación orientada a objetos Capítulo 9 Algo mas sobre herencias.
Tipo de relación entre clases Es uno de los aspectos que distinguen el paradigma de orientación a objetos frente a otros paradigmas. Mecanismo que,
Clases “ Es una Abstracción de un elemento del mundo real ”
Herencias Conceptos básicos i
Programación orientada a objetos La programación orientada a objetos o POO (OOP según sus siglas en inglés) es un paradigma de programación que usa objetos.
GENERICIDAD Es una propiedad que permite definir una clase o función sin especificar el tipo de datos de uno o mas de sus parámetros (Módulos Parametrizados).
Programación Orientada a Objetos Unidad 5. Los objetos son entidades que combinan estado Contiene toda la información denominados atributos REPASO Cada.
Unidad 6 Polimorfismo.
:: Prof. Yeniffer Peña Programación I Programación Orientada a Objetos Presentación.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Asociación.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Objetos.
Reutilización de código Elementos básicos del lenguaje Java Definición de variables, expresiones y asignaciones Fundamentos de Programación Departamento.
This y static. This Normalmente, dentro del cuerpo de un método de un objeto se puede referir directamente a las variables miembros del objeto. Sin embargo,
:: Prof. Yeniffer Peña Programación I Programación Orientada a Objetos Presentación.
RELACIONES ENTRE CLASES M.C. YOLANDA MOYAO MARTINEZ.
Diseño de tipos Igualdad, representación, código, copia y relación de orden Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos.
Prof. Manuel B. Sánchez.  El origen del término polimorfismo es simple: proviene de las palabras griegas poly (muchos) y morphos (forma) multiforme.
Tratamientos secuenciales I Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Unidad Didáctica 8 Versión
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Objetos.
Prof. Manuel B. Sánchez. Es un mecanismo y uno de los pilares de la POO que permite definir nuevas clases a partir de otras preexistentes. La Herencia.
Programación I Clases. Paradigma POO La programación Orientada a objetos (POO) es una forma programar, más cercana a como expresaríamos las cosas en la.
Tipos genéricos Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Unidad Didáctica 3.
Introducción a la Programación Orientada a Objetos (POO) Conceptos de clase, objeto e interfaz. Atributos y métodos Fundamentos de Programación Departamento.
1 Clase 5: primeros programas (3ª parte) iic1102 – introducción a la programación.
Herencia y Clases Abstractas ELO329: Diseño y Programación Orientados a Objetos.
Herencia y Clases Abstractas Reutilización de código y código genérico
Herencia y Clases Abstractas
Herencia y Clases Abstractas Reutilización de código y código genérico
Herencia y Clases Abstractas Reutilización de código y código genérico
Transcripción de la presentación:

Herencia y Clases Abstractas Reutilización de código y código genérico ELO329: Diseño y Programación Orientados a Objetos

Introducción La idea básica es poder crear clases basadas en clases ya existentes. Cuando heredamos de una clase existente, estamos reutilizando código (métodos y atributos). Podemos agregar métodos y atributos para adaptar la clase a la nueva categoría de objetos o situación (la clase nueva). Java también permite consultar por la estructura de una clase (cuáles son sus métodos y atributos). A esto se le llama reflexión (Sabrán los animales que son animales?, el hombre sí tiene conciencia sobre su existencia. En Java se puede consultar por la naturaleza de cada objeto … -fuera del alcance de este curso-)‏

ELO-329: Diseño y Programación Orientados a Objetos Introducción (cont.)‏ La herencia la identificamos cuando encontramos la relación es-un entre la nueva clase y la ya existente. Un estudiante es una persona. La relación es-un es una condición necesaria pero no suficiente, además los objetos de la clase heredada deben cumplir el principio de sustitución. La clase ya existente se le llama superclase, clase base, o clase padre (son sinónimos aquí). A la nueva clase se le llama subclase, clase derivada, o clase hija.

ELO-329: Diseño y Programación Orientados a Objetos Ejemplo: Un Ingeniero es-una persona Persona nombre fecha_de_nacimiento estatura peso Obtener Nombre() Obtener Fecha de Nacimiento() Crecer en 1 cm() : Profesión Lugar de titulación Fecha de titulación Obtener profesión() : Ingeniero Persona Ingeniero Un ingeniero es una persona con propiedades específicas. Extendemos los métodos y/o atributos de Persona para llegar a un Ingeniero. Representación UML de la relación de herencia Universo de Personas Universo de Ingenieros Un ingeniero es un caso particular de persona. Hay otras personas como Médicos, abogados, carpinteros

ELO-329: Diseño y Programación Orientados a Objetos Aspectos sintácticos en Java Si un mánager es un empleado y cumple el principio de sustitución, podemos definir mánager extendiendo empleados: class Manager extends Employee { // aquí ponemos lo específico de un manager // que no está en todo empleado. } Ver ejemplo: TestManager.java Employee Manager Forma gráfica de representar la relación:

ELO-329: Diseño y Programación Orientados a Objetos Redefinición de métodos En la clase derivada podemos redefinir (override, o sobremontar) métodos, lo cual corresponde a re-implementar un método de la clase base en la clase derivada. Si en la clase hija deseamos acceder al método de la clase base, lo podemos hacer utilizando la palabra super como referencia al padre. Notar que también usamos esta palabra reservada para invocar constructores de la clase base.

ELO-329: Diseño y Programación Orientados a Objetos Ejemplo: Un mánager también es un empleado Supongamos que gerentes reciben bonos por su desempeño. Luego su salario será aquel en su calidad de empleado más sus bonos. Ver ManagerTest.java Jerarquía de clases:

ELO-329: Diseño y Programación Orientados a Objetos Principio de sustitución revisitado (propiedad de subtipo) Según el principio de sustitución, referencias a objetos de la clase base, pueden apuntar a objetos de una clase derivada sin crear problemas. Hay que tener cuidado con la relación es-un. El castellano permite decir que un cuadrado es un rectángulo de lados iguales; sin embargo, esto lleva a problemas cuando queremos aplicar el principio de sustitución. Rectángulo Cuadrado ?

ELO-329: Diseño y Programación Orientados a Objetos Ejemplo: ¿Los cuadrados son rectángulos? Por ejemplo veamos una posible implementación aquí: Rectangle.java ¿Qué hay de la memoria ocupada si una aplicación requiere muchos cuadrados? ¿Qué pasa si recibidos una referencia a rectángulo y se nos ocurre invocar un cambio en uno de los lados? Lo podemos arreglar con redefinición de métodos, pero qué pasa con el uso natural que daríamos a rectángulos? Rectángulo Cuadrado ?

ELO-329: Diseño y Programación Orientados a Objetos Polimorfismo (rae: Cualidad de lo que tiene o puede tener distintas formas) Hay varias formas de polimorfismo: Cuando vía subtipo asignamos una instancia de una subclase a una referencia de la clase base. Ej. Un ingeniero adopta el rol de persona. Cuando invocamos el mismo nombre de método sobre instancias de distintas clases Cuando creamos múltiples métodos de igual nombre La primera forma de polimorfismo listada corresponde a Subtipo o principio de sustitución. ¿Cómo podemos asignar un objeto que tiene más atributos a uno que tiene menos? No hay problema cuando ambos son referencias (punteros)..

ELO-329: Diseño y Programación Orientados a Objetos Polimorfismo: Ejemplo Sea: class Employee {..... } class Manager extends Employee {.... } Employee e; e=new Employee(...); // instancia, (caso a ) e=new Manager(..); // OK por Sustitución, (caso b) En el caso a usando e tenemos acceso a todo lo correspondiente a un Employee. En el caso b tenemos acceso a todo lo correspondiente a Employee, pero con la implementación de Manager. Al revés (asignar un empleado a una referencia a Manager) no es válido porque toda referencia a Manager debe disponer de todos los campos.

ELO-329: Diseño y Programación Orientados a Objetos Polimorfismo: Ejemplo Sea: class Employee {..... } class Manager extends Employee {.... } Employee e; e=new Employee(...); // instancia, caso a e=new Manager(..); // OK por Sustitución, caso b Employee e Name Salary hireDay Employee e Manager Name Salary hireDay bonus Employee En e Sólo tenemos acceso a atributos de Employee, pero con la implementación de Manager Referencia Identificador o Nombre Objeto

ELO-329: Diseño y Programación Orientados a Objetos Ligado Dinámico Es importante entender qué método es usado al invocar a un nombre que se puede referir a instancias de clases derivadas. Al momento de la compilación el compilador intenta resolver el método que corresponde según su nombre y parámetros. Si la superclase y la clase base tienen definido el mismo método ¿Cuál se llama?. Si el método en la clase declarada para la referencia no es privado, static, o final, se invocará en forma dinámica. Esto es, se invocará el método definido según el objeto referenciado por el nombre y no según la declaración del nombre (que representa una referencia). A esto se le llama ligado dinámico. Por ello, si una clase derivada redefine el mismo método, éste será invocado para sus instancias. El ligado dinámico se resuelve a tiempo de ejecución, lo cual toma algo de tiempo.

ELO-329: Diseño y Programación Orientados a Objetos Ligado Dinámico (cont.)‏ Gracias el ligado dinámico es posible hacer programas fácilmente extensibles. Creamos una clase derivada y redefinimos los comportamientos que deseamos. No se requiere recompilar las clases existentes. Esto es usado intensamente cuando utilizamos clases predefinidas en el lenguaje. Si deseamos impedir que una de nuestras clases se use como base, la declaramos como final. Éstas no se pueden derivar. final class Manager extends Employee {... } Si un método es final, ninguna subclase puede redefinirlo. El ligado dinámico es más lento que el estático (> tiempo de ejecución).

ELO-329: Diseño y Programación Orientados a Objetos Compilación v/s Ejecución El compilador verifica que los accesos y métodos invocados estén definidos en la clase declarada para el identificador o nombre del objeto usado, o alguna de sus superclases. En tiempo de ejecución, el código ejecutado depende de la declaración del método invocado. Si corresponde ligado dinámico, el código ejecutado será el del objeto apuntado por la referencia. Debemos distinguir entre la clase de la referencia y la clase del objeto apuntado por la referencia.

ELO-329: Diseño y Programación Orientados a Objetos Valores retornados por métodos redefinidos En la redefinición de un método, el nombre y los parámetros se deben conservar; no así el valor retornado. Cuando redefinimos un método en la clase derivada, la clase retornada puede diferir de aquella en el método de la clase base. Se debe cumplir que el objeto retornado por la clase derivada sea subtipo del de la clase base. Ej: Employee getColleague() {…} // en clase base Manager getColleague() {…} // en clase hija.

ELO-329: Diseño y Programación Orientados a Objetos “Casteo”: Cambio de tipo forzado ¿Cómo podemos acceder a un método definido en una clase derivada con una referencia de la clase base? Se debe hacer un cambio de tipo forzado, cuando sabemos que el objeto es una instancia de la clase hija. Por ejemplo: Employee e= new Manager(..); Con e no podemos acceder a los métodos presentes sólo en Manager. Si queremos hacerlo, usamos: Manager m = (Manager) e; Ahora con m sí podemos invocar los métodos de sólo en Manager.

ELO-329: Diseño y Programación Orientados a Objetos “Casteo”: Cambio de tipo forzado (cont.)‏ ¿Cómo sabemos que e es una referencia a una instancia de Manger? Lo podemos preguntar con el operador instance of. if (e instanceof Manager) { m = (Manager) e;..... }

ELO-329: Diseño y Programación Orientados a Objetos Clases abstractas Llevando la idea de herencia a un extremo, podemos pensar en buenas clases para representar un grupo de objetos, pero que su descripción es incompleta al depender de cada subclase. Por ejemplo ElementoFisico como clase base para bloque y resorte; o Forma como clase base de Triangulo, Circulo, Cuadrado; o Compuerta como clase base para And, Or, Not. ElementoFisico puede indicar todo el comportamiento válido para un elemento pero no se puede instanciar por si mismo. No tiene sentido instanciar una clase para la cual no se tiene todos los métodos implementados (ej. dibujese()). Es decir no podemos hacer new Clase(), cuando Clase es abstracta.

ELO-329: Diseño y Programación Orientados a Objetos Clases abstractas (cont.)‏ En el caso de Forma, debe declararse como clase abstracta por tener al menos un método declarado pero no implementado. public abstract class Forma {... public abstract double getArea();.. } ver PersonTest.java

ELO-329: Diseño y Programación Orientados a Objetos Clase Object: Nivel máximo de la jerarquía de clases Toda clase en Java hereda, en su jerarquía máxima, de la clase Object (ver en documentación). Ésta no requiere ser indicada en forma explícita. Esto permite que podamos agrupar en forma genérica elementos de cualquier clase, por ejemplo en un arreglo de Object. En esta clase hay métodos como equals() y toString() que en la mayoría de los casos conviene redefinir. ver documentación de clase Object. Ver: EqualsTest.java

ELO-329: Diseño y Programación Orientados a Objetos Programación genérica/diseño de patrones Las facilidades que ofrece el diseño orientado a objetos y la programación orientada a objetos permiten ofrecer soluciones genéricas. La idea es poder crear código útil para varias situaciones similares. Por ejemplo podemos definir una clase con métodos como: static int find (Object [ ] a, Object key) //buscar en un arreglo ‏ { int i; for (i=0; i < a.length; i++)‏ if (a[i].equals(key) return i; // encontrado return -1; // no exitoso }

ELO-329: Diseño y Programación Orientados a Objetos ArrayList: como Ejemplo de programación genérica Hay muchas estructuras de datos que no quisiéramos programar cada vez, ejemplo: stack, hash, lista, etc. El ArrayList permite crear arreglos de tamaño variable (ver ArrayList en documentación). Lo malo es que el acceso no es con [ ]. Ver ejemplo Cats and Dogs.

ELO-329: Diseño y Programación Orientados a Objetos La clase Class La máquina virtual Java mantiene información sobre la estructura de cada clase. Ésta puede ser consultada en tiempo de ejecución. Employee e = new Employee(...);... Class cl=e.getClass(); La instancia de Class nos sirve para consultar datos sobre la clase, por ejemplo, su nombre. System.out.println(e.getClass().getName()+” “ +e.getName()); genera por ejemplo: Employee Harry Hacker

ELO-329: Diseño y Programación Orientados a Objetos La clase Class (cont.)‏ Ver la clase Class. Nos permite obtener toda la información de una clase, su clase base, sus constructores, sus campos datos, métodos, etc. Por ejemplo ver ReflectionTest.java Esta funcionalidad normalmente es requerida por constructores de herramientas más que por desarrolladores de aplicaciones.