Documentos de Académico
Documentos de Profesional
Documentos de Cultura
ndice
Introduccin Herencia y creacin Herencia y Ocultamiento de la Informacin Redefinicin de caractersticas Polimorfismo Herencia y Sistema de tipos Ligadura dinmica Clase Object Genericidad y Herencia. Genericidad restringida Clases abstractas Interfaces Colecciones en Java (paquete java.util) Patrones de diseo:
Herencia Mltiple
Tema 3
Introduccin
Las clases no son suficientes para conseguir los objetivos de: (A) REUTILIZACIN: Necesidad de mecanismos para generar cdigo genrico:
Capturar aspectos comunes en grupos de estructuras similares Independencia de la representacin Variacin en estructuras de datos y algoritmos
Introduccin
EJEMPLO:
Libros y Revistas tienen propiedades comunes Una Pila puede definirse a partir de una Cola o viceversa Un Rectngulo es una especializacin de Polgono Puede haber distintos tipos de Cuentas
Tiene sentido crear una clase a partir de otra? La herencia es el mecanismo que:
sirve de soporte para registrar y utilizar las relaciones conceptuales existentes entre las clases posibilita la definicin de una clase a partir de otra
Tema 3
Herencia
Jerarquas de herencia
La herencia organiza las clases en una estructura jerrquica formando jerarquas de clases Ejemplos:
PUBLICACION FIGURA POLIGONO RECTANGULO CIRCULO
LIBRO LIBRO_TEXTO
No es tan slo un mecanismo para compartir cdigo Consistente con el sistema de tipos del lenguaje
Tema 3 Herencia 5
Introduccin
B puede aadir nuevos atributos B puede aadir nuevos mtodos B puede redefinir mtodos
B hereda de A
A es la superclase y B la subclase
Tema 3
Herencia
Tipos de herencia
A B D B A
Herencia simple
C E C
Herencia mltiple
Una clase puede heredar de varias clases. Clases forman un grafo dirigido acclico Ejemplos: Eiffel, C++
Herencia 8
Tema 3
Generalizacin (Factorizacin)
Se detectan clases con un comportamiento comn Ejemplo: Libro y Revista son Publicaciones Se detecta que una clase es un caso especial de otra Ejemplo: Rectangulo es un tipo de Poligono
Especializacin (Abstraccin)
No hay receta mgica para crear buenas jerarquas Problemas con la evolucin de la jerarqua
Tema 3 Herencia 9
Adems de abrir cuentas en el banco se pueden contratar depsitos. Un depsito permite a los clientes obtener una rentabilidad por su dinero Un depsito se caracteriza por:
Tema 3
10
Existe un tipo de depsito que se denomina depsito estructurado Un depsito estructurado es un tipo de depsito que se caracteriza por tener una parte del capital invertido a inters fijo y otra parte a inters variable
Debemos crear la clase depsito estructurado desde cero? Podemos aprovechar la existencia de similitudes y particularidades entre ambas clases?
Tema 3
Deposito y DepositoEstructurado
Tema 3
Herencia
14
Clase DepositoEstructurado
public class DepositoEstructurado extends Deposito { private double tipoInteresVariable; private double capitalVariable; public DepositoEstructurado( ) { } public double getInteresesVariable() { return (getPlazoDias() * tipoInteresVariable * capitalVariable)/365; } public double getTipoInteresVariable() { } public void setTipoInteresVariable( double tipoInteresVariable){ } public double getCapitalVariable() { } }
Tema 3 Herencia 15
Clase DepositoEstructurado
Hereda todos los atributos aunque no los vea porque se han definido como privados (Principio Ocultamiento de la Informacin) Puede utilizar todos los mtodos heredados como si fueran propios (por ejemplo, getPlazoDias) Atributos: capitalVariable, tipoInteresVariable Mtodos: getCapitalVariable, setCapitalVariable, getTiopInteresVariable.
Herencia 16
Tema 3
Herencia y creacin
El constructor de la clase hija refina el comportamiento del padre En Java los constructores no se heredan La primera sentencia del constructor de la clase hija SIEMPRE es una llamada al constructor de la clase padre. La llamada al constructor del padre puede ser:
Implcita:
Explcita:
Si se omite, se llamar implcitamente al constructor por defecto Equivale a poner como primera sentencia super(); Si no existe el constructor por defecto en la clase padre dar un error en tiempo de compilacin super(); o super(a,b); o Dependiendo de si el constructor al que invocamos tiene o no argumentos
Herencia 17
Tema 3
Clase DepositoEstructurado
public class DepositoEstructurado extends Deposito { private double tipoInteresVariable; private double capitalVariable; public DepositoEstructurado(Persona titular, double capital, int plazoDias, double tipoInteres, double tipoInteresVariable, double capitalVariable) { //Llamada explcita al constructor del padre super(titular, capital, plazoDias, tipoInteres); this.tipoInteresVariable = tipoInteresVariable; this.capitalVariable = capitalVariable; } }
Tema 3 Herencia 18
Acceso protegido
Una subclase hereda todos los atributos definidos en la superclase, pero no puede acceder a los campos privados. Para permitir que en un mtodo de la subclase se pueda acceder a una caracterstica (atributo/mtodo) de la superclase, ste tiene que declararse como protected
Es discutible la visibilidad protegida para los atributos Es til la visibilidad protegida para los mtodos
De ms restrictivo a menos:
private
protected
public
Tema 3
Herencia
20
Redefinicin
Son vlidos todos los mtodos heredados de la clase depsito para un depsito estructurado?
getCapital: debe devolver la suma del capital fijo ms el capital variable en el caso del depsito estructurado getIntereses: debe devolver la suma del inters fijo y el variable para un depsito estructurado
Al heredar es posible redefinir los mtodos para adaptarlos a la semntica de la nueva clase. La redefinicin reconcilia la reutilizacin con la extensibilidad
Tema 3
Redefinicin
Si la clase hija define un atributo con el mismo nombre que un atributo de la clase padre, ste no est accesible El campo de la superclase todava existe pero no se puede acceder
Un mtodo de la subclase con la misma signatura (nombre y parmetros) que un mtodo de la superclase lo est redefiniendo.
Tema 3
Redefinicin de mtodos
Una clase hija puede redefinir un mtodo de la clase padre por dos motivos:
Reemplazo: se sustituye completamente la implementacin del mtodo heredado manteniendo la semntica. Refinamiento: se aade nueva funcionalidad al comportamiento heredado.
Refinamiento: super
La palabra reservada super se utiliza para invocar a un mtodo de la clase padre Se debe utilizar para el refinamiento de mtodos
Deposito>>getCapital: devuelve el capital fijo DepositoEstructurado>>getCapital: devuelve el capital fijo + capital variable En los mtodos de DepositoEstructurado habr que determinar cul de las dos versiones del mtodo getCapital es la que necesitamos.
Herencia 24
Tema 3
Clase DepositoEstructurado
public class DepositoEstructurado extends Deposito { @Override public double getCapital() { return super.getCapital() + getCapitalVariable(); } @Override public double getIntereses() { return super.getIntereses()+getInteresesVariable(); } }
Tema 3
Herencia
25
Adaptaciones al redefinir
Slo si se relaja
package < protected < public Podemos pasar de menos a ms, pero no al contrario
Siempre que el tipo de retorno del mtodo redefinido sea compatible con el tipo de retorno del mtodo original Un tipo B es compatible con un tipo A si la clase B es subclase de A Ejemplo: Jerarqua de Empleado
Empleado >> public Empleado getColega(){} Jefe >> public Jefe getColega() {}
Herencia 26
Tema 3
En Java se puede aplicar el modificador final a un mtodo para indicar que no puede ser redefinido. Asimismo, el modificador final es aplicable a una clase indicando que no se puede heredar de ella. El modificador final va contra el principio abierto-cerrado?
Tema 3 Herencia 27
El algoritmo del mtodo liquidar es el mismo para todos los depsitos, no se puede redefinir.
Tema 3 Herencia 28
Polimorfismo
El trmino polimorfismo significa que hay un nombre (variable, funcin o clase) y muchos significados diferentes (distintas definiciones). Formas de polimorfismo:
de asignacin (variables polimorfas) puro (funcin polimorfa) ad hoc (sobrecarga) de inclusin (redefinicin) paramtrico (genericidad)
Herencia 29
Tema 3
Polimorfismo de asignacin
Capacidad de una entidad de referenciar en tiempo de ejecucin a objetos de diferentes clases. El conjunto de clases a las que se puede hacer referencia est restringido por la herencia Importante para escribir cdigo genrico El polimorfismo implica que una variable tiene un tipo esttico y un tipo dinmico
Tema 3 Herencia 30
Tipo esttico:
Tipo asociado en la declaracin Tipo correspondiente a la clase del objeto conectado a la entidad en tiempo de ejecucin Conjunto de posibles tipos dinmicos de una entidad A A oa; B ob; C oc; B C E F
te(oa) = A te(ob) = B te(oc) = C ctd(oa) = {A,B,C,D,E,F} ctd(ob) = {B, D, E} ctd(oc) = {C,F}
Herencia 31
Tipo dinmico:
Ejemplo:
D
Tema 3
Polimorfismo de asignacin
1. Deposito deposito = new Deposito(); 2. DepositoEstructurado estructurado = new DepositoEstructurado(); //Asignacin polimrfica 3. deposito = estructurado;
El tipo esttico de la variable deposito es siempre la clase Deposito El tipo dinmico de la variable deposito cambia en tiempo de ejecucin:
En 1 es Deposito En 3. es DepositoEstructurado
Herencia 32
Tema 3
Polimorfismo puro
El mtodo indiceRentabilidad podra recibir como parmetro un objeto de la clase Deposito o de la clase DepositoEstructurado En tiempo de ejecucin se determinar la versin de getIntereses y getCapital que debe ejecutarse (ligadura dinmica)
Tema 3 Herencia 33
Dos o mas funciones comparten el nombre y distintos argumentos (n y tipo). El nombre es polimrfico. Distintas definiciones y tipos (distintos comportamientos) Funcin correcta se determina en tiempo de compilacin segn la signatura. Una nica funcin que puede recibir una variedad de argumentos (comportamiento uniforme). La ejecucin correcta se determina dinmicamente en tiempo de ejecucin
Tema 3 Herencia
Funciones polimrficas:
34
Polimorfismo puro:
Sobrecarga:
A oa; B ob; C oc; D od; Son legales las siguientes asignaciones? oa = ob; oc = ob; oa = od Es legal el mensaje od.metodo1?
Tema 3 Herencia 36
Reglas bsicas:
Regla de compatibilidad de tipos asignaciones vlidas Regla de validez de mensajes mensajes vlidos Fiabilidad Legibilidad Eficiencia
Beneficios esperados:
Tema 3
Herencia
37
al tratar de garantizar que ninguna operacin fallar, el compilador puede rechazar cdigo que tenga sentido en tiempo de ejecucin
i=d;
Tema 3
Compatibilidad de tipos
DepositoEstructurado
Una asignacin polimrfica es vlida slo si el tipo esttico de la parte izquierda es compatible con el tipo de la parte derecha. El paso de parmetros es vlido slo si el tipo del parmetro real es compatible con el tipo del parmetro formal.
Tema 3 Herencia 39
Compatibilidad de tipos
DepositoPenalizable es compatible con Deposito DepositoGarantizado es compatible con Deposito y DepositoEstructurado DepositoGarantizado no es
compatible con
DepositoPenalizable
Deposito deposito = new DepositoEstructurado(); DepositoPenalizable penalizable = new DepositoPenalizable(); // Asignacin polimrfica vlida deposito = penalizable; // Asignacin polimrfica no vlida DepositoGarantizado garantizado = penalizable;
Tema 3 Herencia 40
Compatibilidad de tipos
El tipo del parmetro del mtodo indiceRentabilidad es Deposito. Puede recibir cualquier tipo de depsito como parmetro.
Tema 3
Herencia
41
Validez de mensajes
el mtodo met est definido en la clase del tipo esttico de obj. Los parmetros reales son compatibles con los parmetros formales El mtodo es visible para la clase que invoca el mensaje
Sobre un objeto declarado de tipo DepositoEstructurado se pueden invocar a todos los mtodos definidos en la clase Deposito y la clase DepositoEstructurado Sobre un objeto declarado de tipo Deposito no se puede invocar a los mtodos de DepositoEstructurado
Tema 3 Herencia 42
Validez de mensajes
Deposito deposito = new Deposito(); DepositoEstructurado estructurado = new DepositoEstructurado(); estructurado.liquidar(); //OK HEREDADO DE DEPOSITO estructurado.getCapital(); //OK HEREDADO DE DEPOSITO estructurado.getCapitalVariable(); //OK MTODO PROPIO deposito = estructurado; deposito.getIntereses(); deposito.getCapitalVariable(); //OK METODO DE DEPOSITO //ERROR COMPILACION!!!
Tema 3
Herencia
43
Ligadura dinmica
redefine f {f} B A {f}
A oa; oa.f(..);
qu versin de f se ejecuta?
redefine f
D {f}
Regla de la ligadura dinmica
Ligadura dinmica
La versin de una rutina en una clase es la introducida por la clase (redefinicin u original) o la heredada. Ejemplo 1:
Deposito deposito = new Deposito(); DepositoEstructurado estructurado = new DepositoEstructurado(); deposito.getCapital(); estructurado.getCapital(); deposito = estructurado; deposito.getCapital();
Tema 3
//versin de DepositoEstructurado
Herencia 45
{f}
C redefine f D {f}
Ligadura Dinmica
Ejemplo 2: public double posicionGlobal(Deposito[] depositos) { double posicion = 0; for (Deposito deposito : depositos) { posicion += deposito.getCapital(); } return posicion; } Qu sucede si aparece un nuevo tipo de deposito?
Uno
Dos
Tres
Cuatro
48
1 1 2 2 2 4 2 4 2 2
49
Cdigo genrico
Un nico cdigo con diferentes interpretaciones en tiempo de ejecucin Es fundamental que el lenguaje soporte el polimorfismo El mismo cdigo ejecutar cosas distintas en funcin del tipo dinmico de la entidad polimrfica (ligadura dinmica) Gracias al polimorfismo y la ligadura dinmica se satisface el criterio de reutilizacin de variacin de la implementacin.
Tema 3 Herencia 50
Segn el tipo de depsito sobre el que se aplique se ejecutar una versin u otra de los mtodos getCapital y getIntereses
Tema 3 Herencia 51
Clase Object
Puede existir una clase raz en la jerarqua de la cual heredan las dems directa o indirectamente En Java esta clase es la clase Object La clase Object incluye las caractersticas comunes a todos los objetos Una variable de tipo Object puede apuntar a cualquier tipo del lenguaje, incluidos los tipos primitivos (autoboxing)
Object obj = 7; float i = (Float)obj;
Tema 3 Herencia
OK!!
52
Igualdad de objetos Clonacin de objetos Representacin textual de un objeto Clase a partir de la que ha sido instanciado un objeto. Cdigo hash utilizado en las colecciones.
Herencia 53
Tema 3
Copia de objetos
La asignacin de referencias (=) copia el oid del objeto y no la estructura de datos. Para obtener una copia de un objeto hay que aplicar el mtodo clone. El mtodo clone est implementado en la clase Object (es heredado) pero no es aplicable por otras clases (visibilidad protected). La clase debe redefinir el mtodo clone para aumentar la visibilidad y crear una copia que se adapte a sus necesidades. La versin de la clase Object (super.clone()) construye una copia superficial de la instancia actual.
Tema 3 Herencia 54
Tipos de copia
Tipos de copia:
Copia superficial: los campos de la copia son exactamente iguales a los del objeto receptor. Copia profunda: los campos primitivos de la copia son iguales y las referencias a objetos son copias profundas. Adaptada: adaptada a la necesidad de la aplicacin.
Tema 3
Herencia
55
Aliasing:
cuenta
copia
123456 100000
123456 100000
Herencia
56
123456 100000
123456 100000
-5000 10000
57
123456 100000
326457 100000
-5000 10000
Herencia
58
Igualdad de objetos
El operador de igualdad (==) compara referencias (identidad) El mtodo equals permite implementar la igualdad de objetos La implementacin en la clase Object:
//false si a!=b
Es necesario redefinir el mtodo equals en las clases donde necesitemos la operacin de igualdad. Sin embargo, hay que elegir la semntica de igualdad ms adecuada para la clase.
Tema 3 Herencia 59
Igualdad
Tipos de igualdad:
Superficial: los campos primitivos de los dos objetos son iguales y las referencias a objetos idnticas (comparten los mismos objetos). Profunda: los campos primitivos son iguales y las referencias son iguales (equals) en profundidad. Adaptada: adaptada a las necesidades de la aplicacin.
Mtodos Object
Patrn para redefinir el mtodo equals. Redefinicin del mtodo clone utilizando la copia superficial facilitada por la clase Object. Patrn para la definicin del mtodo toString. Consejos para la definicin de los tres mtodos en una jerarqua de herencia.
Tema 3
Herencia
61
Sobre depositos[i] o depositos.get(i) slo se pueden aplicar operaciones definas en la clase Deposito.
Casting o narrowing
El compilador permite hacer un casting de una variable polimrfica a uno sus posibles tipos dinmicos.
public void setTipoInteresVariable(double tipo, Deposito[] depositos) { for (Deposito d : depositos) { DepositoEstructurado de = (DepositoEstructurado)d; de.setTipoInteresVariable(tipo); } }
Problema:
Si la conversin no es posible falla en tiempo de ejecucin Salta la excepcin ClassCastException y se aborta la ejecucin. Preguntar por el tipo antes de hacer el casting: instanceof vs. getClass()
Tema 3 Herencia 63
Solucin:
Operador instanceOf
public void setTipoInteresVariable(double tipo, Deposito[] depositos) { for (Deposito d : depositos) { if (d instanceof DepositoEstructurado){ DepositoEstructurado de = (DepositoEstructurado)d; de.setTipoInteresVariable(tipo); } } }
Tema 3
Herencia
64
No es lo mismo hace la comprobacin con instanceof que con el mtodo getClass heredado de la clase Object
deposito.getClass()==DepositoEstructurado.class
Object
Hasta la versin 1.4 no se incluye la genericidad como elemento del lenguaje. Se consigue gracias a que toda clase es compatible con la clase Object.
Las colecciones son contenedores de objetos Una entidad de tipo Object puede hacer referencia a cualquier tipo. Hay que efectuar un cast antes de utilizar el objeto que se recupera de la entidad genrica (es un objeto de tipo Object). Se detecta un objeto del tipo no deseado en tiempo de ejecucin.
Herencia 66
Tema 3
Object
class Nodo{ private Object valor; private Nodo siguiente; } public class Lista{ private Nodo cabeza; public Object getFirst(){ return cabeza.getValor(); } } El campo valor del Nodo de la lista puede hacer referencia a cualquier tipo de objeto.
Tema 3 Herencia 67
Object
public void push (Object obj){ contenido.add(obj); ++tope; } public Object pop () { Object elemento = contenido.get(tope); contenido.remove(elemento); return elemento; } }
Tema 3 Herencia 68
Object
ArrayList depositos; //quiero que sea de depsitos Deposito d1, d2; Cuenta cta; p.add(d1); p.add(cta); //NO dara error el compilador d2=depositos.get(0); //error asignamos un Object d2=(Deposito)depositos.get(1); //OK en compilacin //error en ejecucin si lo que se extrae no es un depsito
Perdemos la ventaja de la comprobacin esttica de tipos, las comprobaciones las hace el programador
Tema 3 Herencia 69
Genericidad en Java
A partir de la versin 5 se incluye la definicin de clases genricas como elemento del lenguaje: List<T> Las operaciones aplicables sobre una entidad genrica (variable o atributo de tipo T) son las operaciones disponible para cualquier tipo. Cuando se instancia una clase genrica el conjunto de posibles tipos que puede contener viene determinado por la jerarqua de herencia
Es posible restringir las clases a las que se puede instanciar el parmetro genrico formal de una clase genrica. public class A <T extends B> Slo es posible instanciar T con descendientes de la clase B. Las operaciones permitidas sobre entidades de tipo T son aquellas permitidas sobre una entidad de tipo B. Ejemplos:
class ListaOrdenada <T extends Ordenable> El tipo Ordenable debe incluir la operacin menorQue
Herencia 72
Tema 3
Genericidad restringida
public class CarteraAhorro<T extends Deposito>{ private List<T> contenido; public void liquidar(){ for (T deposito : contenido) deposito.liquidar(); } }
Al restringir la genericidad podemos utilizar los mtodos de Deposito sobre las entidades de tipo genrico (T) T slo podr instanciarse con la clase Deposito o cualquiera de sus subclases.
Tema 3 Herencia 73
Genericidad Restringida
class CarteraAhorro<T extends Deposito & Ordenable> Las operaciones aplicables sobre una entidad genrica son las disponibles tanto en Deposito como en Ordenable
?
Tema 3 Herencia 74
Son equivalentes?
public class CarteraAhorro<T extends Deposito>{ private T [] contenido; public void insertar(T elemento){ ... } ... } public class CarteraAhorro{ private Deposito[] contenido; public void insertar(Deposito deposito){ ... } ... }
Tema 3 Herencia 75
Tema 3
Herencia
76
DepositoEstructurado
List<DepositoEstructurado>
List<Deposito> depositos; List<DepositoEstructurado> estructurados = new LinkedList<DepositoEstructurado>(); depositos = estructurados; //ERROR en tiempo de compilacin
Tema 3
Herencia
77
El compilador trata de asegurar que sobre una lista de depsitos estructurados no se incluyan depsitos con plazo fijo. Sin embargo, existe un agujero en el sistema de tipos de Java:
List lista; lista = new LinkedList<Deposito>(); // compila lista = new LinkedList<DepositoEstructurado>(); // compila lista.add(POO); // compila!!
Cuando se declara una variable de un tipo genrico sin parametrizar se asigna el tipo puro (raw):
Object en el caso de una clase genrica no restringida Tipo por el que se restringe la genericidad
Herencia 78
Tema 3
List<DepositoEstructurado> estructurados = new ...; List<Deposito> depositos; //depositos = estructurados error en tiempo de compilacin //Sin embargo List lista; lista = estructurados; depositos = (List<Deposito>)lista;
//COMPILA!!
Tema 3
Herencia
79
public double posicionGlobal(List<Deposito> depositos) { double posicion = 0; for (Deposito deposito : depositos) { posicion += deposito.getCapital(); } return posicion; }
Significa: permite cualquier lista genrica instanciada a la clase Deposito o a cualquiera de sus subclases Si pasamos como parmetro un objeto List<DepositoEstructurado>, ste ser el tipo reconocido dentro del mtodo. No hay riesgo de inserciones ilegales dentro de la coleccin.
Tema 3 Herencia 81
puro
Todas las consultas sobre el tipo dinmico siempre devuelven el tipo puro:
(lp instanceof List<Deposito>) //no compila (lp instanceof List) //si compila
Herencia 82
Tema 3
Clases abstractas
Ambos tienen un titular Ambos tienen un mtodo para calcular los impuestos (getImpuestos) 18% del beneficio
Tiene sentido crear instancias de la clase ProductoFinanciero? Cmo se implementa el mtodo getBeneficio en ProductoFinanciero? Tienen sentido definir el mtodo getBeneficio como un mtodo vaco en ProductoFinanciero?
Herencia 83
Tema 3
Tema 3
Clase ProductoFinanciero
public abstract class ProductoFinanciero { private Persona titular; public ProductoFinanciero(Persona titular) { this.titular = titular; } public Persona getTitular() { return titular; } public double getImpuestos() { return getBeneficio() * 0.18; } public abstract double getBeneficio(); }
Tema 3 Herencia 85
Clases abstractas
Toda clase que contenga algn mtodo abstracto (heredado o no) es abstracta. Una clase puede ser abstracta y no contener ningn mtodo abstracto. Especifica una funcionalidad que es comn a un conjunto de subclases aunque no es completa. Puede ser total o parcialmente abstracta. No es posible crear instancias de una clase abstracta, pero si declarar entidades de estas clases.
Las clases abstractas slo tienen sentido en un lenguaje con comprobacin esttica de tipos.
Tema 3 Herencia 86
Importante mecanismo para incluir cdigo genrico. Incluyen comportamiento abstracto comn a todos los descendientes. Se satisface el requisito de reutilizacin de factorizar comportamiento comn.
Tema 3 Herencia 87
No incluye implementacin
Tendra sentido que una clase pudiera heredar de ms de una clase totalmente abstracta?
Evita los problemas de heredar ms de una implementacin Permite ampliar el conjunto de tipos que puede representar un objeto de una clase
Solucin: Interfaces
Tema 3 Herencia 88
Interfaces en Java
Por defecto, toda la definicin de una interfaz es pblica Slo contiene definiciones de mtodos y constantes
No se puede crear un objeto del tipo de la interfaz, pero si utilizarlo en la declaracin de variables.
Tema 3
Ejemplo de Interfaz
Un depsito puede ser amortizable lo que permite rescatar parte del capital antes del vencimiento.
public interface Amortizable { double LIMITE = 10000.0; boolean amortizar(double cantidad); }
El mtodo amortizar devuelve un valor booleano para indicar si se pudo realizar la amortizacin.
Tema 3 Herencia 90
La clase debe implementar los mtodos definidos en la interfaz Si una clase no implementa todos los mtodos de una interfaz debe declararse como abstracta
Una clase puede heredar de una nica clase Puede implementar ms de una interfaz Una interfaz puede extender ms de una interfaz
Herencia 91
Tema 3
Interfaz Amortizable
Tema 3
Herencia
92
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 e iterables. 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
Tema 3
Herencia
94
Collection
devuelve
Map
devuelve
ListIterator
List
Set
SortedMap
AbstractMap
AbstractCollection AbstractList
SortedSet
TreeMap
HashMap
ArrayList
AbstractSequentialList LinkedList
Tema 3
Herencia
95
Iteradores en Java
Las colecciones de Java son iterables. El recorrido for each slo es aplicable sobre objetos iterables Evita tener que manejar explcitamente el objeto iterador. La implementacin de un iterador requiere crear una clase responsable de llevar el estado de la iteracin Clases internas
Tema 3 Herencia 96
Iteradores en Java
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.
Tema 3 Herencia 97
Iteradores en Java
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<E> { boolean hasNext(); E next(); void remove(); }
Tema 3
Herencia
98
Clases internas
Clase que se declara dentro de otra Los objetos de esta clase estn ligados al objeto de la clase contenedora donde se crean La clase interna tiene visibilidad sobre las declaraciones de la clase contenedora Los objetos de la clase interna pueden acceder a los atributos y mtodos del objeto contenedor como si fueran propios.
Los objetos de la clase interna se crean dentro de un mtodo de instancia de la clase que los contiene
Tema 3
Herencia
100
List<Cuenta> cuentas = new LinkedList<Cuenta>(); ... public void imprimeMorosos(){ Iterator<Cuenta> iterador = cuentas.iterator();
while (iterador.hasNext()){
} }
Tema 3 Herencia 101
Patrones de diseo
Soluciones a problemas que aparecen recurrentemente en la POO. 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:
Tema 3
Mtodo Plantilla
Define en una operacin el esqueleto de un algoritmo, delegando en las subclases algunos de sus pasos. Permite que las subclases redefinan ciertos pasos del algoritmo sin cambiar su estructura. El algoritmo factoriza un comportamiento comn a un conjunto de subclases. El algoritmo se implementar en un mtodo efectivo que har uso de otros mtodos abstractos de la clase (clases parcialmente abstractas).
Tema 3 Herencia 103
Mtodo Plantilla
Tema 3
Herencia
104
Mtodo Plantilla
En la aplicacin bancaria a los titulares de los productos financieros se les manda la informacin fiscal La informacin fiscal de un producto financiero contiene: el nombre del titular, el producto financiero contratado, el beneficio obtenido y el valor de los impuestos cobrados. El mtodo que genera el informe fiscal es una plantilla de cdigo
Tema 3
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(); } public abstract String getTipo(); public abstract double getBeneficio(); }
Tema 3 Herencia 106
NOTA: - Ejemplo de cdigo reutilizable del Tema1 - Recordad los criterios de reutilizacin
Tema 3 Herencia 107
Mtodo Plantilla
public abstract class Coleccion<T> { public boolean buscar (T x){ comenzar(); while (!fin() && !encontrado){ if (x.equals(item()) encontrado = true; avanzar(); } return encontrado; } public abstract void comenzar(); public abstract boolean fin(); public abstract T item(); public abstract void avanzar(); }
Tema 3 Herencia 108
Patrn Estrategia
Permite definir una familia de algoritmos que se pueden intercambiar en tiempo de ejecucin
En la aplicacin bancaria, supongamos que la clase Banco almacena la lista de todos los productos financieros Cmo podemos implementar un mtodo de bsqueda que devuelva todos los productos financieros que cumplen una determinada condicin? La condicin de bsqueda puede cambiar de una bsqueda a otra
Todos los depsitos con el capital mayor de 10000 Todos los productos contratados por Pepito Prez Todos los depsitos que vencen en una determinada fecha
Herencia 110
El mtodo test evala si el ProductoFinanciero que se le pasa como parmetro cumple o no el criterio de bsqueda
Cada criterio de bsqueda se implementa en una clase que implementa la interfaz Criterio.
Tema 3 Herencia 111
Para buscar los productos que cumplen un determinado criterio de bsqueda habr que pasar como parmetro al mtodo buscar un objeto de una clase que implemente el criterio.
Banco banco = new Banco(); List<ProductoFinanciero> depositosAltos; Criterio criterio = new CapitalAlto(10000.0); depositosAltos = banco.buscar(criterio);
Tema 3
Herencia
114
Estrategias annimas
Tiene sentido crear una clase por cada criterio? Solucin basada en clases annimas
banco.buscar(new Criterio(){ public boolean test (ProductoFinanciero p){ if (p instanceof Deposito){ Deposito deposito = (Deposito)p; return deposito.getCapital() > 10000.0; } else return false; } });
Tema 3 Herencia 115
Estrategias annimas
public List<ProductoFinanciero> buscarUmbral (final double umbral){ return buscar(new Criterio(){ public boolean test(ProductoFinanciero producto) { if (producto instanceof Deposito){ Deposito deposito = (Deposito)producto; return deposito.getCapital() > umbral; } else return false; } }); }
Tema 3 Herencia 116
Implementar una clase que represente una lista ordenada El criterio de ordenacin se establece en el momento de la creacin de la lista El mtodo add inserta los elementos de acuerdo al orden establecido
Aplicarlo para construir una lista ordenada de productos financieros por orden alfabtico de los titulares.
Tema 3 Herencia 117
Patrn Composite
Permite representar objetos compuestos. Permite que los clientes traten de manera uniforme a los objetos individuales y a los compuestos.
Tema 3
Herencia
118
Supongamos que en el banco existen carteras de negocios. Una cartera de negocios es un producto financiero Una cartera de negocios est formada por otros productos financieros incluidas otras carteras Una cartera de negocios es un producto financiero compuesto
Tema 3
Tema 3
Herencia
120
Clase CarteraNegocio
public class CarteraNegocio extends ProductoFinanciero { private List<ProductoFinanciero> productos; public CarteraNegocio(Persona titular){ super(titular); productos = new LinkedList<ProductoFinanciero>(); } public void addProducto(ProductoFinanciero p) { } @Override public double getBeneficio() { double total = 0; for (ProductoFinanciero producto : productos) total+=producto.getBeneficio(); return total; } }
Tema 3 Herencia 121
Herencia mltiple
Qu proporciona la herencia?
Posibilidad de reutilizar el cdigo de otra clase (perspectiva mdulo). Hacer que el tipo de la clase sea compatible con el de otra clase (perspectiva tipo).
En Java la herencia es simple. La limitacin de tipos impuesta por la herencia es superada con el uso de interfaces. Sin embargo, slo es posible reutilizar cdigo de una clase.
Tema 3 Herencia 122
Herencia mltiple
Motivacin:
Cuenta Remunerada: es una cuenta bancaria que tambin ofrece rentabilidad como un depsito.
Tema 3
Herencia
123
Herencia mltiple
Interfaz IDeposito
Tema 3
Herencia
125
CuentaRemunerada es compatible con el tipo depsito definido por la interfaz IDeposito Cmo podemos reutilizar la implementacin de la clase Deposito?
Tema 3 Herencia 126
Tema 3
Herencia
127
La clase CuentaRemunerada delega la implementacin de los mtodos de la interfaz IDeposito en la clase Deposito
Tema 3 Herencia 129
Puede que necesitemos reutilizar la implementacin de la clase Deposito pero extendiendo la definicin original Definimos una clase interna que herede de Deposito:
La clase interna puede redefinir mtodos de la clase Deposito La clase interna puede aplicar mtodos de la clase contenedora (CuentaRemunerada)
Tema 3
Herencia
130
Herencia Mltiple
public class CuentaRemunerada extends Cuenta implements IDeposito { private double saldoMedioUltimoMes() { } private class DepositoImpl extends Deposito { DepositoImpl(Persona titular, double capital, int plazoDias, double tipoInteres) { super(titular, capital, plazoDias, tipoInteres); } @Override public double getCapital() { return saldoMedioUltimoMes(); } }
Tema 3 Herencia 131
Tema 3
Herencia
132
La clase CuentaRemunerada delega la implementacin de los mtodos de la interfaz IDeposito en la clase interna
Tema 3 Herencia 133
Hay que poner las operaciones y campos comunes en la superclase No se deben utilizar atributos protegidos Hay que utilizar la herencia para modelar la relacin es_un No se debe utilizar la herencia salvo que todos los mtodos heredados tengan sentido No hay que modificar la semntica de un mtodo en la redefinicin Hay que utilizar el polimorfismo y no la informacin relativa al tipo
Tema 3 Herencia 134