Documentos de Académico
Documentos de Profesional
Documentos de Cultura
POO3 Java 0910
POO3 Java 0910
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:
Mtodo plantilla, Patrn Estrategia y Patrn Composite
Herencia Mltiple
Tema 3 Herencia 2
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
Entre algunas clases pueden existir relaciones conceptuales: EJEMPLO:
Extensin, Especializacin, Combinacin 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 LIBRO LIBRO_TEXTO REVISTA INVESTIGACION MAGAZINE FIGURA POLIGONO RECTANGULO CIRCULO
No es tan slo un mecanismo para compartir cdigo Consistente con el sistema de tipos del lenguaje
Tema 3 Herencia 5
Introduccin
Si una clase B hereda de otra clase A entonces:
B incorpora la estructura (atributos) y comportamiento (mtodos) de la clase A B puede incluir adaptaciones:
B puede aadir nuevos atributos B puede aadir nuevos mtodos B puede redefinir mtodos
C hereda de B y A
B
B y C son subclases de A B es un descendiente directo de A C es un descendiente indirecto de A
Tema 3
Herencia
Tipos de herencia
A B D B A E C C Herencia simple
Una clase puede heredar de una nica clase. Ejemplo: Java, C#
Herencia mltiple
Una clase puede heredar de varias clases. Clases forman un grafo dirigido acclico Ejemplos: Eiffel, C++
Tema 3
Herencia
Especializacin (Abstraccin)
Se detecta que una clase es un caso especial de otra Ejemplo: Rectangulo es un tipo de Poligono
No hay receta mgica para crear buenas jerarquas Problemas con la evolucin de la jerarqua
Tema 3 Herencia 9
10
Debemos crear la clase depsito estructurado desde cero? Podemos aprovechar la existencia de similitudes y particularidades entre ambas clases?
DepositoEstructurado hereda de Deposito
Tema 3 Herencia 13
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
Depsito estructurado hereda todas las caractersticas de depsito:
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)
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:
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
Explcita:
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
protected
visible a las subclases y al resto de clases del paquete
public
visible a todas las clases
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
Es raro reutilizar una clase sin necesidad de hacer cambios
Tema 3 Herencia 21
Redefinicin
Los atributos no se pueden redefinir, slo se ocultan
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.
Si se cambia el tipo de los parmetros se est sobrecargando el mtodo original
Tema 3 Herencia 22
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
No se tiene que utilizar para invocar a mtodos heredados
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
Se puede cambiar el nivel de visibilidad
Slo si se relaja
package < protected < public Podemos pasar de menos a ms, pero no al contrario
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:
Polimorfismo Polimorfismo Polimorfismo Polimorfismo Polimorfismo
Tema 3
de asignacin (variables polimorfas) puro (funcin polimorfa) ad hoc (sobrecarga) de inclusin (redefinicin) paramtrico (genericidad)
Herencia 29
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 dinmico:
Tipo correspondiente a la clase del objeto conectado a la entidad en tiempo de ejecucin
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
Tema 3 Herencia 32
Polimorfismo puro
Mtodo que puede recibir como argumento objetos de diferentes tipos
El parmetro es una entidad polimrfica
public double indiceRentabilidad(Deposito deposito) { return deposito.getIntereses()/deposito.getCapital(); }
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
Funciones polimrficas:
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
34
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
Beneficios esperados:
Tema 3
Herencia
37
Compatibilidad de tipos
Un tipo B es compatible con un tipo A slo si la clase B es descendiente de la clase A.
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.
DepositoPenalizable penalizable = new DepositoPenalizable(); banco.indiceRentabilidad (penalizable);
Tema 3
Herencia
41
Validez de mensajes
Una llamada a un mtodo obj.met() es vlida si:
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? Qu relacin existe entre ligadura dinmica y comprobacin esttica de tipos?
Sea el mensaje x.f (), la comprobacin esttica de tipos garantiza que al menos existir una versin aplicable para f, y la ligadura dinmica garantiza que se ejecutar la versin ms apropiada
Tema 3 Herencia 47
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
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
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:
public boolean equals (Object objeto){ return this == objeto; }
//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
En el seminario 2 de prcticas se incluye:
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
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: Solucin:
Tema 3
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()
Herencia 63
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
comprueba si el tipo dinmico de la variable deposito es exactamente la clase DepositoEstructurado Ver el seminario 2 de prcticas para ms detalle
Tema 3 Herencia 65
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
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
List<Deposito> contendr cualquier tipo de depsito.
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
Una clase se puede restringir a ms de un tipo:
class CarteraAhorro<T extends Deposito & Ordenable> Las operaciones aplicables sobre una entidad genrica son las disponibles tanto en Deposito como en Ordenable
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
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
Tema 3 Herencia 78
//COMPILA!!
Tema 3
Herencia
79
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
Tema 3 Herencia 82
Clases abstractas
En el banco existen cuentas y depsitos con propiedades en comn:
Ambos tienen un titular Ambos tienen un mtodo para calcular los impuestos (getImpuestos) 18% del beneficio
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.
Aunque la clase puede incluir la definicin del constructor.
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
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
Los mtodos son abstractos, no es necesario especificarlo explcitamente
No se puede crear un objeto del tipo de la interfaz, pero si utilizarlo en la declaracin de variables.
Una interfaz es un tipo
Tema 3 Herencia 89
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
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.
Ejemplo: llamada a size y get en el iterador
Los objetos de la clase interna se crean dentro de un mtodo de instancia de la clase que los contiene
Ejemplo: mtodo iterator
Tema 3
Herencia
100
} }
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:
Mtodo Plantilla Patrn Estrategia Patrn Composite
Tema 3 Herencia 102
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
Factoriza el comportamiento comn a todos los productos financieros
Tema 3 Herencia 105
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
Por ejemplo: algoritmos de ordenacin, criterios de seleccin, etc.
Cada criterio de bsqueda se implementa en una clase que implementa la interfaz Criterio.
Tema 3 Herencia 111
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
Solucin basada en clases annimas que necesita un parmetro
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
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
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
En Java slo podemos heredar de una clase:
Elegimos la clase Cuenta como clase padre.
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
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