Diseño y Programación Orientada a Objetos Conferencia # 9 Clases genéricas TEMA # 3: Herencia y Polimorfimo Facultad Ing. Informática ISPJAE
Contenido Clases y funciones genéricas. Implementación de funciones miembros de clases parametrizadas. Instanciación de clases parametrizadas. Clase genérica ArrayList
Introducción Uno: a, b, c Dos: a, d, e ¿Abstracta o concreta? Tres int b; int c; Dos int d; int e; Tres int a; Uno: a, b, c Dos: a, d, e ¿Abstracta o concreta?
Uno Dos resp1 a2+b+c a2*d*e resp2 b*c d+a a[i].resp1(); Tres[] a; int b; int c; Dos int d; int e; Tres int a; Uno Dos resp1 a2+b+c a2*d*e resp2 b*c d+a a[i].resp1(); a[i].resp2(); Tres[] a;
Tres #int a; +resp1(){return a*a;} +abstract resp2(); Uno -int b; -int c; +resp1(){return super.resp1()+b+c;} +resp2(){return b*c;} Dos -int d; -int e; resp1(){return super.resp1()+d*e;} resp2(){return d+a;}
Clases genéricas Necesarias cuando al momento de implementar el código no se conocen algunos de los tipo de datos que se deben procesar. Colecciones Juan Ana Eva
Clases genéricas Mayor nivel de abstracción. Especifican un parámetro en la definición, que representa un tipo de dato durante la ejecución. clases parametrizadas plantillas en C++ (template)
En Java Existen clases genéricas predefinidas desde las primeras versiones. A partir de la versión 1.5 se introduce la posibilidad de declarar clases genéricas. Generador de código parametrizado
Métodos genéricos El tipo de algunos de los datos que recibe o que se utilizan internamente, se especifican cuando se invoca al método.
Declaración Clase o interfaz Clases genéricas public class C <T1,…,Tn> { ... } Métodos genéricos public <T1,…, Tn> void m(T1 p1, …, Tn pn) { Tipos de datos (clases) que se especifican al crear objetos Clase o interfaz
Ejemplo public class MYClass<A,B> { … }
Instanciando clases genéricas por defecto heredan de Object Igual cantidad No permite primitivos: int, float, … public class MYClass<A,B> { … } MYClass <String, Integer> myclass= new MyClass<String, Integer>(); MYClass <String, Person> myclass; MYClass <String, MYClass <OtherClass,String>> myclass;
Contenedoras genéricas Variante 1: public class GenericCollection<T>{ private Objetc[] data; … } Variante 2: private T[] data; …
Implementación (Var 1) public class GenericCollection<T> { private Object[] data; private int count; private static final int DEFAULT_CAPACITY =10; public GenericCollection() { this(DEFAULT_CAPACITY); }
Implementación (Var 1) public GenericCollection(int cap) { if(cap > 0) data= new Object[cap]; else data= new Object[DEFAULT_CAPACITY]; count = 0; }
Implementación (Var 1) private void ensureCapacity(int minCapacity) { … Object[] newData= new Object[ …]; }
Implementación (Var 1) public void add(T t) { if (count == data.length) ensureCapacity(count + 1); data[count++] = t; } public T get(int i){ if(inRange(i)) return (T)data[i]; else return null;
Implementación (Var 1) private boolean inRange(int index) { boolean result= false; if(index >=0 && index < count) result= true; return result; }
Implementación (Var 1) public T remove(int index) { T oldValue= null; if(inRange(index)) { oldValue = (T)data[index]; int num = count - index - 1; if(num > 0) System.arraycopy(data, index+1, data, index, num); data[--count] = null; } return oldValue; } }
Implementación (Var 2) public class GenericCollection<T> { private T[] data; private int count; private static final int DEFAULT_CAPACITY=10;
Implementación (Var 2) public GenericCollection(T[] t, int count) { data = t; this.count = count; }
Implementación (Var 2) public GenericCollection() { count = 0; data = (T[]) new Object[DEFAULT_CAPACITY]; }
Implementación (Var 2) public T get(int i) { T result= null; if (inRange(i)) result= data[i]; return result; }
Implementación (Var 2) public T remove(int index) { T oldValue= null; if (inRange(index)) { oldValue = data[index]; … result= oldValue; } return result;
Clases genéricas con parámetros restringidos Puede ser Person o cualquiera de sus derivadas public class GenericCollection<T extends Person> {…} Ejemplos: GenericCollection<Teacher> myCollection = new GenericCollection<Teacher>(); GenericCollection<Worker> myCollection = new GenericCollection<Worker>();
Utilidad ¿Si no se especifica? public class GenericCollection<T extends Person> {… public T findById(String id){ int i= 0; while (i < count && !((T)data[i]).getID().equalsIgnoreCase(id)) i++; return i < count? (T)data[i] : null; } ¿Si no se especifica? ¿Qué pasa?
Jerarquía de clases genéricas public class NumberCollection<T> extends GenericCollection<T> { … public T sum() { (T)s= 0; for(int i=0; i , count; i++) s+= (T)data[i]; return s; } …}
Clase genérica ArrayList AbstractList<E> ArrayList<E>
Clase genérica ArrayList public class ArrayList<E> extends AbstractList<E> …{ … private Object[] elementData; private int size;
Algunos métodos de ArrayList ArrayList(): Construye lista vacía para 10 elementos ArrayList(int capacity): Construye lista vacía para capacity elementos. boolean add(E o): Agrega o al final de la lista E get(int index): devuelve elemento en index. E remove(int index): Elimina elemento en index.
Ejemplo de uso de ArrayList ArrayList<Person> store = new ArrayList<Person>(20); Person item = new Person(); store.add(item);
Modificando CheesCollection public class CheesCollection{ private ArrayList<Cheese> cheeses; public CheesCollection() { cheeses = new ArrayList<Cheese>(); } …
//Obtener importe total de la factura public float amount() { float sum = 0; for(int i = 0; i < cheeses.size(); i++) sum += cheeses.get(i).price(); return sum; }
//Obtener todos los quesos esféricos: public ArrayList<SphereCheese> sphereCheeseColl() { ArrayList<SphereCheese> sphChe = new ArrayList<SphereCheese>(); for(int i = 0; i < cheeses.size(); i++) if(cheeses.get(i) instanceof SphereCheese) sphChe.add((SphereCheese) cheeses.get(i)); return sphChe; }
Estudio Independiente Caso de estudio: Escalafón para Técnicos Medio de Informática. Motivación Caso de estudio Integradores. Patrón Singleton