Herencia en Java Parte 2
Herencia en Java Parte 2
Contenido
Genericidad. Colecciones. Patrones de Diseo:
Mtodo plantilla. Estrategia. Composicin.
Curso 2010/2011
Genericidad
Facilidad de un lenguaje de programacin para definir clases parametrizadas con tipos de datos. Resultan de utilidad para la implementacin de tipos de datos contenedores como las colecciones. La genericidad slo tiene sentido en lenguajes con comprobacin esttica de tipos, como Java o C#. La genericidad permite escribir cdigo reutilizable.
Curso 2010/2011 Programacin Orientada a Objetos 3
Clase Contenedor
public class Contenedor<T> { private T contenido; public void setContenido(T contenido) { this.contenido = contenido; } public T getContenido() { return contenido; } }
Curso 2010/2011 Programacin Orientada a Objetos 4
Genericidad
La parametrizacin de una clase genrica se realiza en la declaracin de una variable y en la construccin.
Curso 2010/2011
Genericidad
Una clase genrica es una clase normal, salvo que dentro de su declaracin utiliza un tipo variable (parmetro), que ser definido cuando sea utilizada. Dentro de una clase genrica se pueden utilizar otras clases genricas. Una clase genrica puede tener varios parmetros.
public class ContenedorDoble <T,K> { private String nombre; private Contenedor<T> clave; private K valor; } ContenedorDoble<String, Cuenta> contenedor =
Curso 2010/2011 Programacin Orientada a Objetos 7
Genericidad restringida
Objetivo: limitar los tipos a los que puede ser parametrizada una clase genrica. Al restringir los tipos obtenemos el beneficio de poder aplicar mtodos sobre los objetos de tipo genrico. Una clase con genericidad restringida slo permite ser parametrizada con tipos compatibles con el de la restriccin (clase o interfaz).
Curso 2010/2011
Genericidad restringida
La clase CarteraAhorro slo puede ser parametrizada con tipos compatibles con Deposito. Podemos aplicar mtodos disponibles en la clase Deposito.
public class CarteraAhorro<T extends Deposito> { private LinkedList<T> contenido; public void liquidar() { for (T deposito : contenido) deposito.liquidar(); } }
Curso 2010/2011 Programacin Orientada a Objetos 10
Genericidad restringida
Son equivalentes?
public class CarteraAhorro<T extends Deposito> { private LinkedList<T> contenido; public void insertar(T deposito) { contenido.add(deposito); } } public class CarteraAhorro { private LinkedList<Deposito> contenido; public void insertar(Deposito deposito) { contenido.add(deposito); } }
Curso 2010/2011 Programacin Orientada a Objetos 11
Genericidad restringida
Con genericidad restringida podemos declarar la siguiente variable:
CarteraAhorro<DepositoGarantizado> seguro = ;
Es posible especificar el tipo de depsito de la cartera, compatible con Deposito. En el ejemplo slo podran introducirse depsitos garantizados y subtipos.
En cambio, con la segunda declaracin no podemos restringir el tipo de depsito. Podemos mezclar distintos tipos de objetos depsito.
Curso 2010/2011
12
Genericidad restringida
Una clase genrica puede estar restringida por varios tipos:
public class Contenedor<T extends Deposito & Amortizable>
Por tanto, las operaciones disponibles para objetos de tipo T son las de todos los tipos.
Curso 2010/2011
13
Genericidad y herencia
Una clase puede heredar de una clase genrica. La nueva clase tiene las opciones:
Mantener la genericidad de la clase padre.
public class CajaSeguridad<T> extends Contenedor<T>
Restringir la genericidad.
public class CajaSeguridad<T extends Valorable> extends Contenedor<T>
Curso 2010/2011
14
No hay relacin
DepositoEstructurado Contenedor<DepositoEstructurado>
Curso 2010/2011
15
Contenedor contenedor = new Contenedor(); // Object CarteraAhorro cartera = new CarteraAhorro(); // Deposito
Siendo:
Clase Contenedor<T> Clase CarteraAhorro<T extends Deposito>
Curso 2010/2011 Programacin Orientada a Objetos 16
Se utiliza un comodn, que significa: permite cualquier lista genrica parametrizada a la clase Depsito o a un tipo compatible (subclase). Si pasamos como parmetro un objeto List<DepositoEstructurado>, ste ser el tipo reconocido dentro del mtodo. El tipo comodn se puede usar para declarar variables locales o atributos. No se puede utilizar el tipo comodn para construir objetos.
Curso 2010/2011
18
Curso 2010/2011
22
Seminario 3
En el Seminario 3 se incluye un apartado que trata la genericidad. Se incluyen los siguientes ejemplos:
Genericidad basada en Object. Definicin de una clase genrica. Genericidad restringida.
Curso 2010/2011
23
Colecciones en Java
Las colecciones en Java son un ejemplo destacado de implementacin de cdigo reutilizable utilizando un lenguaje orientado a objetos. Todas las colecciones son genricas. Los tipos abstractos de datos se definen como interfaces. Se implementan clases abstractas que permiten factorizar el comportamiento comn a varias implementaciones. Un mismo TAD puede ser implementado por varias clases List: LinkedList, ArrayList
Curso 2010/2011
24
Colecciones en Java
Iterator
devuelve
Collection
devuelve
Map
devuelve
ListIterator
List
Set
SortedMap
AbstractMap
AbstractCollection AbstractList
SortedSet
TreeMap
HashMap
ArrayList
AbstractSequentialList LinkedList
Curso 2010/2011
25
Interfaz Collection<T>
Define las operaciones comunes a todas las colecciones de Java. Permite manipular colecciones basndonos en su interfaz en lugar de en la implementacin. Los tipos bsicos de colecciones son:
Listas, definidas en la interfaz List<T> Conjuntos, definidos en la interfaz Set<T>
Curso 2010/2011
26
Interfaz Collection<T>
Operaciones bsicas:
size(): devuelve el nmero de elementos. isEmpty(): indica si tiene elementos. add(T e): aade un elemento a la coleccin. Retorna un booleano indicando si acepta la insercin. remove(Object e): intenta eliminar el elemento. Retorna un booleano indicando si ha sido eliminado. clear(): elimina todos los elementos. contains(Object e): indica si contiene el objeto
27
Interfaz List<T>
La interfaz List<T> define secuencias de elementos a los que se puede acceder atendiendo a su posicin. Las posiciones van de 0 a size()-1.
El acceso a una posicin ilegal produce la excepcin IndexOutOfBoundsException
El mtodo add(T e) aade al final de la lista. Aade a las operaciones de Collection mtodos de acceso por posicin como:
T get (int index) T set (int index, T element) void add (int index, T element) T remove (int index)
Curso 2010/2011 Programacin Orientada a Objetos 28
Implementaciones de Listas
ArrayList<T> Implementacin basada en arrays redimiensionables. Operaciones de insercin y modificacin ineficientes. Operaciones de creacin y consulta rpidas. LinkedList<T> Implementacin basada en listas doblemente enlazadas Inserciones y modificaciones rpidas, especialmente en el principio y el final:
addFirst, addLast, removeFirst, removeLast
Curso 2010/2011
30
Se debe utilizar el tipo de la interfaz como valor de retorno. Todas las colecciones disponen del constructor de copia.
Curso 2010/2011 Programacin Orientada a Objetos 31
Interfaz Set<T>
La interfaz Set<T> define conjuntos de elementos no repetidos. Para evitar la insercin de elementos repetidos, la igualdad de los objetos se comprueba con equals. Implementaciones de conjuntos:
HashSet<T> guarda los elementos del conjunto en una tabla hash. TreeSet<T> implementacin de conjuntos ordenados basada en rboles binarios balanceados.
Curso 2010/2011
32
Interfaz Map<K,V>
La interfaz Map<K,V> define el tipo de datos que representa pares <clave, valor>
Un mapa no puede tener claves duplicadas. Cada clave slo puede tener un valor asociado.
Curso 2010/2011
33
Interfaz Map<K,V>
Mtodos bsicos:
V put(K clave, V valor): inserta una asociacin en el
mapa.
Retorna el valor de la antigua asociacin, si la hubiera. V get(clave): retorna el valor asociado a una clave. Si la asociacin no existe, devuelve nulo. Set<K> keySet(): devuelve el conjunto de claves. Collection<V> values(): devuelve la coleccin de valores. boolean containsKey(key): indica si existe una clave. Set<Map.Entry<K, V>> entrySet(): devuelve el conjunto
Curso 2010/2011
34
Curso 2010/2011
36
Curso 2010/2011
37
El mtodo compareTo devuelve un entero positivo si la relacin es mayor que, negativo si es menor que y cero si son iguales.
Curso 2010/2011 Programacin Orientada a Objetos 38
Curso 2010/2011
39
Curso 2010/2011
40
Criterios de ordenacin
Para definir un criterio de ordenacin hay que implementar la interfaz Comparator.
public interface Comparator<T> { public int compare(T o1, T o2); }
El mtodo compare devuelve un entero positivo si la relacin es mayor que, negativo si es menor que y cero si son iguales.
Curso 2010/2011
41
public Persona(String dni, String nombre){ misCuentas = new TreeSet<Cuenta>(new OrdenTitular()); //TreeSet utiliza el orden establecido //en la clase OrdenTitular para ordenar las cuentas } }
Curso 2010/2011
43
Iteradores
Las colecciones de Java son iterables, es decir, podemos recorrer todos sus elementos. Se utilizan iteradores para que el cdigo que realiza el recorrido no conozca las particularidades de la estructura de datos: lista enlazada, lista basada en arrays, etc.
public double posicionGlobal(List<Deposito> depositos) { double posicion = 0; for (Deposito deposito : depositos) { posicion += deposito.getCapital(); } return posicion; }
Curso 2010/2011 Programacin Orientada a Objetos 44
Iteradores
Java proporciona la interfaz Iterable<T> que debe ser implementada por aquellas clases sobre las que se pueda iterar:
public interface Iterable<T> { Iterator<T> iterator(); }
A los objetos iterables se les exige que creen objetos iterador (Iterator) para realizar la iteracin. Los arrays y la interfaz Collection son iterables.
Curso 2010/2011 Programacin Orientada a Objetos 45
Iteradores
Interfaz Iterator<T>:
hasNext(): indica si quedan elementos en la iteracin. next(): devuelve el siguiente elemento de la iteracin. remove(): elimina el ltimo elemento devuelto por el iterador.
public interface Iterator<T> { boolean hasNext(); T next(); void remove(); }
Curso 2010/2011 Programacin Orientada a Objetos 46
public double posicionGlobal(List<Deposito> depositos) { double posicion = 0; for (Deposito deposito : depositos) { posicion += deposito.getCapital(); } return posicion; }
Curso 2010/2011
47
public double filtrar(List<Deposito> depositos) { Iterator<Deposito> it = depositos.iterator(); while (it.hasNext()) { Deposito deposito = iterator.next(); if (deposito.getCapital() < 1000) it.remove(); } }
Curso 2010/2011 Programacin Orientada a Objetos 48
Patrones de diseo
Soluciones a problemas que aparecen recurrentemente en la Programacin Orientada a Objetos. Diseo de clases reutilizable que se puede adaptar a diferentes situaciones. La definicin de un patrn de diseo es independiente del lenguaje que se utilice para implementarlo. Vamos a estudiar: Patrn Mtodo Plantilla. Patrn Estrategia. Patrn Composicin.
Curso 2010/2011 Programacin Orientada a Objetos 49
Mtodo Plantilla
Define en un mtodo el esqueleto de un algoritmo, delegando en las subclases algunos de sus pasos. Permite que las subclases implementen ciertos pasos del algoritmo sin cambiar su estructura. El algoritmo factoriza un comportamiento comn a un conjunto de subclases. El algoritmo se implementa en un mtodo efectivo que har uso de otros mtodos abstractos de la clase.
Curso 2010/2011 Programacin Orientada a Objetos 50
Mtodo Plantilla
Curso 2010/2011
51
52
Mtodo Plantilla
public abstract class ProductoFinanciero { public double getImpuestos() { return getBeneficio() * 0.18; } public String getInforme(){ return "Titular:" + titular + ", producto contratado: " + getTipo() + ", beneficios: " + getBeneficio() + ", impuestos: " + getImpuestos(); } protected abstract String getTipo(); public abstract double getBeneficio(); }
Curso 2010/2011 Programacin Orientada a Objetos 53
Mtodo Plantilla
Las clases hijas implementan los mtodos necesarios para completar el mtodo plantilla.
public Deposito extends ProductoFinanciero { protected String getTipo() { return "Deposito"; } public double getBeneficio() { return getIntereses(); } }
Curso 2010/2011
54
Patrn Estrategia
Permite definir una familia de algoritmos que se pueden intercambiar en tiempo de ejecucin
Ejemplos: algoritmos de ordenacin, criterios de seleccin, etc.
56
Cada criterio de bsqueda se implementa en una clase que implementa la interfaz Criterio.
Curso 2010/2011 Programacin Orientada a Objetos 57
Curso 2010/2011
59
Curso 2010/2011
60
Patrn Estrategia
En el caso de estudio las estrategias se establecen como parmetro de un mtodo. La estrategia tambin puede almacenarse en un atributo:
Este atributo puede ser inicializado en la construccin del objeto con una estrategia. Se podra establecer en cualquier momento con un mtodo set. La interfaz Comparator es una estrategia de comparacin que se pasa como parmetro en el constructor de TreeSet y se almacena como atributo.
Otro caso es que la estrategia sea solicitada a los subtipos a travs de un mtodo abstracto.
Curso 2010/2011 Programacin Orientada a Objetos 61
63
Patrn Composicin
Permite representar objetos compuestos. Los clientes tratan de manera uniforme a los objetos individuales y a los compuestos.
Curso 2010/2011
64
Curso 2010/2011
65
Patrn Composicin
Curso 2010/2011
66
Patrn Composicin
public class CarteraNegocio extends ProductoFinanciero { private List<ProductoFinanciero> productos; public CarteraNegocio(Persona titular){ super(titular); productos = new LinkedList<ProductoFinanciero>(); } public void addProducto(ProductoFinanciero p) { productos.add(p); } public void removeProducto(ProductoFinanciero p) { productos.remove(p); }
Curso 2010/2011
67
Patrn Composicin
public class CarteraNegocio extends ProductoFinanciero { @Override public double getBeneficio() { double total = 0;
Curso 2010/2011
68