Interfaces y Clases Internas

Slides:



Advertisements
Presentaciones similares
Curso de java básico (scjp)
Advertisements

Curso de java básico (scjp)
Curso de Java Capitulo 7: Conceptos sobre poo Profesor:
Definición de Clases y Variables de referencia.
Herencia en C#.
Fundamentos de la programación orientada a objetos
Lenguaje de programación Java
UML 1.4 Peter Emerson Pinchao Solis.
Arquitectura CLARO-TECNOTREE
UNIVERSIDAD LATINA (UNILA) ENCAPSULACION Y HERENCIA
Aplicación del paradigma orientado a objetos
Diseño y programación de
Encapsulamiento y Abstracción
Abstracción de Datos La abstracción es un recurso fundamental en la programación orientada a objetos y está además fuertemente ligado a reusabilidad.
Objetos y Clases en Java
Programación Orientada a Objetos en Java
PROGRAMACIÓN EN JAVA Curso-taller inicial de programación en JAVA Facultad de Estadística e Informática TEMA II.
HERENCIA.
Lenguaje de Programación Java Profesor: Mauricio Martínez P. Análisis y Diseño Orientado a Objetos UML: Lenguaje de Modelamiento Unificado Toma de Requerimientos.
Tema 7: Polimorfismo Antonio J. Sierra. Índice Introducción. Sobrecarga de métodos. Objetos como parámetros. Paso de argumentos. Devolución de objetos.
Modificadores.
Polimorfismo Lenguajes de Programación II Corporación Universitaria del Caribe CECAR.
Abstracción de los datos y Orientación a Objeto Clase 13.
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.
Tema 6: Clases Antonio J. Sierra.
1 Herencia en Java Agustín J. González Diseño y Programación Orientados a Objetos.
1 Interfaces Agustín J. González ELO Introducción En C++ se permite la herencia múltiple; es decir, es posible derivar una clase de dos o más clases.
SCJP Sun Certified Programmer for Java 6
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.
7. Interfaces Herencia múltiple Interfaces Comparable y Comparator
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Encapsulamiento.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Encapsulamiento.
1 Objetos y Clases en Java ELO-329: Diseño y Programación Orientados a Objetos.
Clases en C++ Agustín J. González ELO329.
Herramientas de polimorfismo y herencia en C++
CS-432: Ingeniería Moderna de Software Semana 3
Manejo de Punteros y objetos en memoria dinámica en C++
PATRON PROTOTYPE Cristina Merino Héctor Carbajo Alicia Arroyo.
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.
1 Interfaces y Clases Internas ELO-329: Diseño y programación orientados a objetos Agustín J. González.
1 Interfaces y Clases Internas ELO-329: Diseño y programación orientados a objetos Agustín J. González.
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.
Funciones y Clases Amigas (Friend)‏ Miembros Estáticos (Static)
Detalles Generales sobre Java
Algoritmos y Programación III
Herencia y Clases Abstractas
1 Interfaces Agustín J. González ELO Introducción En C++ se permite la herencia múltiple; es decir, es posible derivar una clase de dos o más clases.
Abstracción El concepto de abstracción es esencial en ciencias de la computación. Un programa es en sí mismo una abstracción, un modelo de la resolución.
La Programación Orientado a Objetos
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.
Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Práctica 4 Versión Diseño de tipos Igualdad, representación, código,
Las interfaces Predicate y Function Versión Unidad Didáctica 17 Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos.
Programación en Java Introducción a Java. Reseña histórica Surge en 1991 por Sun Microsystems Desarrollado para electrodomésticos Se buscaba un código.
Concepto de Tipo y Subtipo Diseño e Implementación Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Unidad Didáctica 10 Versión.
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.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Herencia.
Interfaces y Clases Internas ELO329: Diseño y Programación Orientados a Objetos.
ELO329: Diseño y Programación Orientados a Objetos
ELO329: Diseño y Programación Orientados a Objetos
ELO329: Diseño y Programación Orientados a Objetos
ELO329: Diseño y Programación Orientados a Objetos
ELO329: Diseño y Programación Orientados a Objetos
Transcripción de la presentación:

Interfaces y Clases Internas ELO329: Diseño y Programación Orientados a Objetos

¿Qué queremos decir con interfaces y clases internas? NOTA: El término interfaz aquí NO se refiere a las interfaces gráficas (ya viene ...). Aquí las interfaces son una manera de describir qué debería hacer una clase sin especificar el cómo. Faz =>entre caras => Interfaz, plural interfaces Las clases internas son clases anidadas dentro de otras clases o métodos. Interfaces y clases internas son recursos esenciales en el manejo de interfaces gráficas en Java. Será nuestro próximo tópico.

ELO-329: Diseño y Programación Orientados a Objetos Interfaces Una interfaz es la descripción de uno o más servicios (métodos) que posteriormente alguna clase puede implementar (y por ende ofrecer). Por ejemplo, si un alumno es ayudante, entonces podríamos preguntarle por su sueldo u otras cosas propias de un funcionario. Es así como un ayudante además de ser alumno es capaz de responder consultas propias de un funcionario. Así un Ayudante además de ser Alumno (herencia) cumple con la interfaz Funcionario. También podríamos decir que él es un “Funcionario” (la misma relación que en herencia). Gracias a las interfaces podemos crear métodos genéricos (como ordenar) que manipulen objetos y les exijan a éstos sólo funcionalidades mínimas requeridas (como poder compararse). ELO-329: Diseño y Programación Orientados a Objetos

Interfaces Implementación de Ayudante Archivo que define la interfaz Definición de la Interfaz: Incluye todo lo que objetos debería ser capaces de ofrecer. Clase que implementa la interfaz Ej. Ayudante Implementación de Ayudante Archivo que define la interfaz Ej. Funcionario.java Implementación hecha en alguna clase Ej. Aquí implementamos los métodos de la interfaz Funcionario.java ELO-329: Diseño y Programación Orientados a Objetos

ELO-329: Diseño y Programación Orientados a Objetos Interfaces (cont.)‏ En Java cada clase puede tener sólo una clase base (en Java no hay herencia múltiple). Cuando hay relación es-un con más categorías del mundo real, usamos herencia con una de ellas e interfaces para exhibir un comportamiento como el esperado por las otras. Se cumple también el principio de sustitución. Instancias de la clase que implementa una Interfaz pueden ser usadas donde se espera una instancia de la interfaz. Es similar a usar una instancia de una subclase cuando se espera un objeto de la clase base. ELO-329: Diseño y Programación Orientados a Objetos

ELO-329: Diseño y Programación Orientados a Objetos Interfaces (cont.)‏ No se permite crear instancias (objetos) de una Interfaz. Por la misma razón que no se puede crear instancias de clases abstractas, no se tienen la implementaciones. new InterfazX(); Todos los métodos de una Interfaz son públicos. No es necesario indicarlo. Pueden incluir constantes. En este caso son siempre public static final. ELO-329: Diseño y Programación Orientados a Objetos

Interfaces: Aspectos sintácticos Debemos atender dos cosas: Si la interfaz no existe, debemos definirla. Luego debemos implementar la interfaz en alguna clase. Definición de una interfaz, en un archivo de nombre Comparable.java, poner: public interface Comparable{ int compareTo (Object other); } Implementación de una interfaz: class Employee implements Comparable { .... public int compareTo(Object other) { ....// implementación } ELO-329: Diseño y Programación Orientados a Objetos

Ejemplo: uso de interfaces Consideremos la extensión de la clase Employee para que podamos ordenar arreglos de empleados según su salario. La interfaz Comparable ya está definida en el lenguaje, luego sólo debemos implementarla. Ver EmployeeSortTest.java Ver documentación de clase Arrays e interfaz Comparable. Notar el métodos genérico sort de la clase Arrays. ELO-329: Diseño y Programación Orientados a Objetos

ELO-329: Diseño y Programación Orientados a Objetos Clases Anidadas Clases anidadas son clases definidas al interior de otra clase. Tres razones para ofrecer esto en Java: Es una manera de agrupar clases usadas en un lugar. Aumenta la encapsulación Generan código más leíble y mantenible. Cuando sólo necesitamos crear instancias de una clase al interior de sólo una clase, podemos definir la clase al interior de ésta. Pueden haber clases anidadas estáticas o no estáticas, a estas últimas se les llama internas. ELO-329: Diseño y Programación Orientados a Objetos

ELO-329: Diseño y Programación Orientados a Objetos Clases Anidadas Clase Anidada Clase Anidada estática Clase Anidada no estática o Interna Ejemplo: class OuterClass { // Clase anfitriona ... static class StaticNestedClass { // estática } class InnerClass { // interna ELO-329: Diseño y Programación Orientados a Objetos

Clases Anidadas (cont.) Las clases internas tienen acceso a los atributos de la externa (incluso si son privados) pero las anidadas estáticas no. Las estáticas están asociadas a la clase anfitriona. Las internas están asociadas a instancias de clase anfitriona. Como miembros de la clase anfitriona, las clases anidadas pueden ser declaradas private, public, protected o privadas del paquete (cuando omitimos el calificador). Son muy útiles para reducir código fuente. Especialmente cuando la clase sólo genera instancias locales. Son comunes en el desarrollo de interfaces gráficas. ELO-329: Diseño y Programación Orientados a Objetos

Clases Anidadas (Cont.)‏ Las clases internas existen sólo para el compilador, ya que éste las transforma en clases regulares separando la clase externa e interna con signo $. La máquina virtual no distingue la clases internas. También se pueden definir al interior de un método. Ejemplo creación de una instancia (en declaraciones public): Clases estáticas anidadas: OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass(); Clase interna (no estática): OJO primero debemos crear un objeto: OuterClass outerObject = new OuterClass(); OuterClass.InnerClass innerObject = outerObject.new InnerClass(); En este curso usaremos principalmente clases anidadas no públicas. ELO-329: Diseño y Programación Orientados a Objetos

Ejemplo de Clase Interna class BankAccount { public BankAccount(double initialBalance) { balance = initialBalance; } public void start(double rate) { ActionListener adder = new InterestAdder(rate); Timer t = new Timer(1000, adder); t.start(); } private double balance; private class InterestAdder implements ActionListener { public InterestAdder(double aRate) { rate = aRate; } public void actionPerformed(ActionEvent event) { double interest = balance * rate / 100; balance += interest; NumberFormat formatter = NumberFormat.getCurrencyInstance(); System.out.println("balance=" + formatter.format(balance)); } private double rate; } } Ver InnerClassTest.java ELO-329: Diseño y Programación Orientados a Objetos

Clase interna dentro de un método class BankAccount { public BankAccount(double initialBalance) { balance = initialBalance; } public void start(double rate) { class InterestAdder implements ActionListener { public InterestAdder(double aRate) { rate = aRate; } public void actionPerformed(ActionEvent event) { double interest = balance * rate / 100; balance += interest; NumberFormat formatter = NumberFormat.getCurrencyInstance(); System.out.println("balance=" + formatter.format(balance)); } private double rate; } ActionListener adder = new InterestAdder(rate); Timer t = new Timer(1000, adder); t.start(); } private double balance; } Ver: InnerClassMethodTest.java ELO-329: Diseño y Programación Orientados a Objetos

Clases internas anónimas ¿Si sólo deseáramos proveer de una implementación a los métodos de una interfaz, para qué definir una clase? Cuando necesitamos sólo una instancia de una clase que implementa una interfaz, no necesitamos darle un nombre. Decimos que tal clase es interna y anónima. Ver AnonymousInnerClassTest.java ELO-329: Diseño y Programación Orientados a Objetos

Ejemplo: Clase Anónima class BankAccount { public BankAccount(double initialBalance) { balance = initialBalance; } public void start(final double rate) { ActionListener adder = new ActionListener() { public void actionPerformed(ActionEvent event) { double interest = balance * rate / 100; balance += interest; NumberFormat formatter = NumberFormat.getCurrencyInstance(); System.out.println("balance=" + formatter.format(balance)); } }; Timer t = new Timer(1000, adder); t.start(); } private double balance; } //Única instancia // Implementación //Ver AnonymousInnerClassTest.java ELO-329: Diseño y Programación Orientados a Objetos

Método clone() en Object (revisitado) El método clone() existe con acceso protegido en la clase Object. Para invocarlo sobre un objeto se requiere que la clase del objeto implemente la interfaz Cloneable, lo cual significa que debemos redefinir el método clone. Para generar un clone correcto, debemos hacerlo invocando el método clone de la clase Object. El método clone de Object crea y retorna un objeto con igual estructura del objeto llamado e inicializa todos sus campos con el mismo contenido de los campos del objeto llamado. Los contenidos de cada campo no son clonados (hasta aquí se le llama copia baja), luego para una copia completa (profunda) se debe llamar el método clone con cada atributo. ELO-329: Diseño y Programación Orientados a Objetos

Copia baja v/s copia profunda 50000 Carl Cracker float salario String name Date hireDay August 27, 2010 empleado1 50000 float salario String name Date hireDay empleado2 empleado2 = empleado1.clone(); // como copia baja empleado3 = empleado1.clone(); // copia profunda 50000 Carl Cracker float salario String name Date hireDay August 27, 2010 empleado3 ELO-329: Diseño y Programación Orientados a Objetos

Implementación de clone (copia profunda) La implementación típica es como sigue: class Employee implements Cloneable { public Object clone() { // redefinición de clone try { // el manejo de excepciones de revisará más adelante Employee c = (Employee) super.clone(); // no usamos constructor c.hireDay = hireDay.clone(); return c; } catch (CloneNotSupportedException e ) { return null; } ..... private String name; private float salary; private Date hireDay; Hasta aquí copia baja Necesarios para copia profunda Ver CloneTest.java ELO-329: Diseño y Programación Orientados a Objetos