Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Contenido
Genericidad en Java. Colecciones en Java. Genericidad en C++. Colecciones en C++.
Curso 2010/2011
Genericidad en Java
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. 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
Una clase genrica puede estar restringida por varios tipos:
Por tanto, las operaciones disponibles para objetos de tipo T son las de todos los tipos.
Curso 2010/2011
11
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
12
No hay relacin
DepositoEstructurado Contenedor<DepositoEstructurado>
Curso 2010/2011
13
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 14
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
16
Curso 2010/2011
20
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
21
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
22
Collection
devuelve
Map
devuelve
ListIterator
List
Set
SortedMap
AbstractMap
AbstractCollection AbstractList
SortedSet
TreeMap
HashMap
ArrayList
AbstractSequentialList LinkedList
Curso 2010/2011
23
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
24
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
25
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 26
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
28
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 29
Curso 2010/2011
30
Implementaciones de conjuntos
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.
Implementa la interfaz SortedSet<T>
La interfaz SortedMap<K,V> extiende la interfaz Map<K,V> para proporcionar la funcionalidad de mapas ordenados por claves.
Las operaciones son anlogas a las de la interfaz SortedSet considerando el conjunto de claves. firstKey y lastKey: primera y ltima clave SortedMap<K,V> headSet (T toKey) SortedMap<K,V> tailSet (T fromKey) SortedMap<K,V> subSet (T fromKey ,T toKey)
Curso 2010/2011
32
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
Genericidad en C++
La clases genricas en C++ se conocen como templates. Ejemplo: Contenedor
template <class T> class Contenedor{ private: T contenido; public: T getContenido(); void setContenido (T elem); };
Curso 2010/2011
49
Genericidad Implementacin
La implementacin de la clase genrica debe realizarse en el fichero de cabecera:
Curso 2010/2011
50
Genericidad Uso
Se indica el tipo de la clase genrica en su declaracin. Puede ser aplicada a tipos primitivos.
Persona* titular = new Persona("juan", "34914680"); Cuenta* cuenta = new Cuenta(titular); Contenedor<Cuenta*> contenedor; contenedor.setContenido(cuenta); Cuenta* cta = contenedor.getContenido(); Contenedor<int> cEntero; cEntero.setContenido(10);
Curso 2010/2011
51
Genericidad Crticas
C++ no implementa un autntico sistema de genericidad. Cuando se usa una clase genrica, se realiza un reemplazo del texto del parmetro en la declaracin de la clase. Por tanto, se genera cdigo para cada uno de los tipos a los que se instancie la clase genrica.
Curso 2010/2011
52
Genericidad restringida
No se puede restringir la genericidad. Est permitido aplicar cualquier mtodo y operador sobre las entidades del tipo genrico (tipo T en el ejemplo). Es problemtico determinar la sintaxis de los mensajes, ya que se puede instanciar a tipos por valor o referencia. Si la operacin no est disponible sobre el tipo genrico, el error ser detectado en tiempo de compilacin.
Curso 2010/2011
53
Colecciones en C++
Todas las entidades de la Librera Estndar C++ se han incluido en un nico espacio de nombres denominado std. La librera estndar de plantillas, o STL (Standard Template Library), implementa un conjunto de estructuras de datos y algoritmos que conforman una parte sustancial de la Librera Estndar C++. Las estructuras de datos genricas se denominan contenedores. Los contenedores son clases genricas (template) pensadas para contener cualquier tipo de objeto. No existe un contenedor comn raz de la jerarqua.
Curso 2010/2011 Programacin Orientada a Objetos 54
Tipos de colecciones
Existen dos tipos de contenedores:
Secuencias:
Almacenan los elementos en orden secuencial. Adecuadas para accesos directos y secuenciales. vector, list, deque (cola de doble terminacin), stack
Asociaciones:
Almacenan pares de valores <clave, valor>. Podra verse como una array en el que el ndice no tiene por qu ser un entero. Adecuados para accesos aleatorios mediante claves. map, set
Curso 2010/2011 Programacin Orientada a Objetos 55
Cuenta.h
#include <list> using namespace std;
class Cuenta { public: list<double>* getOperaciones() const; private: list<double>* operaciones; void anotarOperacion(double cantidad); };
Curso 2010/2011
56
Cuenta.cpp
Cuenta::Cuenta (Persona* persona, double saldoInicial){ operaciones = new list<double>(); }
Curso 2010/2011
57
Prueba de listas
int main () { Cuenta* cuenta = new Cuenta(titular); cuenta->ingreso(100); cuenta->reintegro(300); cuenta->ingreso(1000); list<double>* movimientos; movimientos = cuenta->getOperaciones(); list<double>::const_iterator it; it = movimientos->begin(); for (; it != movimientos->end() ;++it) cout << (*it) << endl; exit(0); }
Curso 2010/2011 Programacin Orientada a Objetos 58
Prueba de listas
La implementacin de las listas no ofrece mtodos para accesos aleatorios porque seran ineficientes. Slo dispone de mtodos de acceso al principio y al final
Se puede utilizar de forma efectiva como una pila
Curso 2010/2011
59