Documente Academic
Documente Profesional
Documente Cultură
Contenido
Introduccin. Definicin y tipos. Constructores. Redefinicin. Restringir la herencia. Visibilidad protegida. Polimorfismo. Herencia y sistema de tipos. Ligadura dinmica. Clase Object. Autoboxing. Copia de objetos. Igualdad de objetos. Casting Operador instanceof Clases abstractas. Interfaces.
Curso 2010/2011
Introduccin
Las clases no son suficientes para conseguir los objetivos de: Reutilizacin:
Necesidad de mecanismos para definir cdigo genrico
Extensibilidad:
Principios de diseo modular: eleccin nica y abierto-cerrado.
Curso 2010/2011
Cdigo genrico
Factoriza un funcionalidad comn a un conjunto de tipos. Se trata de un cdigo independiente de la representacin escogida para los tipos de datos. El cdigo genrico soporta variacin de algoritmos y estructuras de datos.
Cada tipo puede escoger una estructura de datos diferente. Los algoritmos implementados por cada tipo para una misma funcin pueden ser diferentes.
Cdigo genrico
Ejemplo: funcin de bsqueda en una coleccin secuencial
Se pueden elegir diferentes representaciones para una coleccin secuencial: array, lista enlazada, etc. La funcin de bsqueda es igual para todas las representaciones. Se debe implementar una nica vez para todas las colecciones secuenciales (factorizar comportamiento comn). Para cada estructura de datos las operaciones de la coleccin (avanzar, obtener el elemento actual, etc.) se implementan de manera diferente.
Curso 2010/2011
Extensibilidad
Principio de Eleccin nica:
Evitar, cuando sea posible, manejar listas de variantes.
if (cuenta.getTipo() == TipoCuenta.CORRIENTE) { cuenta.setComision(COMISION_DEFECTO); } else if (cuenta.getTipo() == TipoCuenta.REMUNERADA) { cuenta.setComision(0); } else if (cuenta.getTipo() == TipoCuenta.AHORRO) { cuenta.setComision(COMISION_DEFECTO / 2); }
Curso 2010/2011
Extensibilidad
Principio Abierto-Cerrado:
Un mdulo est abierto si est disponible para ser adaptado: aadir o modificar funcionalidad. Un mdulo est cerrado si est disponible para ser utilizado. La extensibilidad del cdigo se ve favorecida por mdulos que estn abiertos y cerrados al mismo tiempo. Objetivo: extender un mdulo sin afectar al cdigo que ya haca uso de ese mdulo. Ejemplo: modificacin de la operacin de reintegro de las cuentas para que permita descubiertos que generan intereses, sin modificar la clase Cuenta.
Curso 2010/2011 Programacin Orientada a Objetos 8
Introduccin
Entre las clases pueden existir relaciones conceptuales: Extensin, Especializacin, Combinacin. Ejemplos:
Una pila puede definirse a partir de una cola o viceversa Un rectngulo es una especializacin de polgono Libros y Revistas tienen propiedades comunes
Herencia:
Mecanismo para definir y utilizar estas relaciones. Permite la definicin de una clase a partir de otra.
Curso 2010/2011 Programacin Orientada a Objetos 9
Introduccin
La herencia organiza las clases en una estructura jerrquica Jerarqua de clases No es slo un mecanismo de reutilizacin de cdigo. Es consistente con el sistema de tipos. Ejemplos:
PUBLICACION LIBRO LIBRO_TEXTO
Curso 2010/2011
10
Herencia
Si la clase B hereda de A, entonces B incorpora la estructura (atributos) y comportamiento (mtodos) de la clase A, pero puede incluir adaptaciones:
B puede aadir nuevos atributos. B puede aadir nuevos mtodos. B puede redefinir mtodos heredados (refinar o reemplazar).
Curso 2010/2011
11
Herencia Terminologa
B hereda de A (A es la superclase y B la subclase)
Curso 2010/2011
12
Tipos de herencia
A B D B A E C C
Herencia simple:
Una clase puede heredar de una nica clase. Java, C#
Herencia mltiple:
Una clase puede heredar de varias clases. C++
Curso 2010/2011
13
Reconocer la herencia
Especializacin:
Se detecta que una clase es un caso especial de otra. Ejemplo: Rectngulo es un tipo de Polgono.
Generalizacin (factorizacin):
Se detectan dos clases con caractersticas en comn y se crea una clase padre con esas caractersticas. Ejemplo: Libro, Revista Publicacin
Caso de estudio
Continuacin de la aplicacin de gestin bancaria. Se introduce el concepto Depsito que permite a un cliente obtener intereses por su dinero. Un Depsito, simplificado, se define:
Propiedades: titular, capital, plazo en das y tipo de inters. Comportamiento:
Permite liquidar el depsito devolviendo el capital depositado ms los intereses. Permite consultar los intereses generados al vencimiento.
Curso 2010/2011 Programacin Orientada a Objetos 15
Caso de Estudio
Identificamos el concepto Depsito Estructurado que se caracteriza por tener una parte del capital a tipo fijo y otra parte a tipo variable. Depsito Estructurado es un Depsito? Comparte todas las caractersticas de Depsito. Aade nuevas caractersticas. La clase DepositoEstructurado hereda de Deposito: Nuevas caractersticas: capital a tipo variable y el tipo de inters variable.
Curso 2010/2011 Programacin Orientada a Objetos 18
Clase DepositoEstructurado
public class DepositoEstructurado extends Deposito { private double tipoInteresVariable; private double capitalVariable; public DepositoEstructurado() {} public double getInteresesVariable() { return (getPlazoDias() * tipoInteresVariable * capitalVariable)/365; } public void setTipoInteresVariable( public double getTipoInteresVariable() { } public double getCapitalVariable() { } }
Curso 2010/2011 Programacin Orientada a Objetos 19
Clase DepositoEstructurado
La subclase incluye las caractersticas especficas:
Atributos: tipo de inters variable y capital a tipo variable. Mtodo de consulta (get) del capital variable. Mtodos de consulta/establecimiento (get/set) del tipo de inters variable. Mtodo para el clculo de los intereses del capital a tipo variable.
La clase hija hereda todos los atributos de la clase padre, aunque no los vea debido a la ocultacin de la informacin. La clase dispone de los mtodos heredados como si fueran propios (ejemplo, getPlazoDias()).
Curso 2010/2011 Programacin Orientada a Objetos 20
Jerarqua de herencia
Curso 2010/2011
21
Herencia y constructores
En Java los constructores no se heredan. El constructor de un DepositoEstructurado se declara con los mismos parmetros que un Deposito y aade la cantidad de capital a tipo variable. La clase DepositoEstructurado no tiene visibilidad sobre los atributos privados de Deposito. Java permite invocar a los constructores de la clase padre dentro de un constructor utilizando la llamada super()
Curso 2010/2011 Programacin Orientada a Objetos 22
Clase DepositoEstructurado
public class DepositoEstructurado extends Deposito { public DepositoEstructurado(Persona titular, double capitalFijo, double capitalVariable, int plazoDias, double tipoInteresFijo) { super(titular, capitalFijo, plazoDias, tipoInteresFijo); this.capitalVariable = capitalVariable; } }
Curso 2010/2011 Programacin Orientada a Objetos 23
Herencia y constructores
Cuando se aplica herencia, la llamada a un constructor de la clase padre es obligatoria. Debe ser la primera sentencia del cdigo del constructor. Si se omite la llamada, el compilador asume que la primera llamada es super() Llama al constructor sin argumentos de la clase padre. Si no existe ese constructor, la clase no compila.
Curso 2010/2011
24
Redefinicin de mtodos
La redefinicin de un mtodo heredado puede ser de dos tipos:
Refinamiento: se aade nueva funcionalidad al comportamiento heredado. Reemplazo: se sustituye completamente la implementacin del mtodo heredado.
Curso 2010/2011
26
Clase DepositoEstructurado
public class DepositoEstructurado extends Deposito { ... @Override public double getIntereses() { return super.getIntereses() + getInteresesVariable(); } @Override public double getCapital() { return super.getCapital() + getCapitalVariable(); } }
Curso 2010/2011
28
Caso de estudio
Identificamos un nuevo tipo de depsito formado por una parte del capital a tipo fijo y otra a tipo variable con un inters mnimo garantizado (Depsito Garantizado). Este depsito posee todas las caractersticas de un Depsito Estructurado y aade una garanta al inters variable (regla es un). La clase DepositoGarantizado hereda de DepositoEstructurado.
Curso 2010/2011
29
Clase DepositoGarantizado
public class DepositoGarantizado extends DepositoEstructurado { private double tipoInteresGarantizado; public DepositoGarantizado(, { super(titular, capitalFijo, capitalVariable, plazoDias, tipoInteresFijo); this.tipoInteresGarantizado = tipoIntersesGarantizado; setTipoInteresVariable(tipoIntersesGarantizado); } }
Curso 2010/2011 Programacin Orientada a Objetos 30
Redefinicin de mtodos
Esta clase debe controlar que al establecer el tipo de inters variable no quede por debajo del inters garantizado. Para ello, redefine (refina) el mtodo setTipoInteresVariable().
@Override public void setTipoInteresVariable( double tipoInteresVariable) { if (tipoInteresVariable >= tipoInteresGarantizado) super.setTipoInteresVariable(tipoInteresVariable); } }
Curso 2010/2011 Programacin Orientada a Objetos 31
Caso de estudio
Un Depsito Penalizable es un depsito bsico en el que los intereses pueden ser penalizados. El nuevo depsito tiene todas las caractersticas de un depsito bsico (regla es un). Clase DepositoPenalizable hereda de Deposito La penalizacin consiste en reducir el inters del depsito a la mitad. Adapta el clculo de los intereses segn la penalizacin.
Curso 2010/2011
32
Clase DepositoPenalizable
public class DepositoPenalizable extends Deposito { private boolean penalizado; public DepositoPenalizable() { super(titular, capital, plazoDias, tipoInteres); penalizado = false; } @Override public double getIntereses() { if (penalizado) return super.getIntereses() / 2; else return super.getIntereses(); } public boolean isPenalizado() {} public void setPenalizado(boolean penalizado) {} }
Curso 2010/2011 Programacin Orientada a Objetos 33
Jerarqua de herencia
Curso 2010/2011
34
Redefinicin
En los ejemplos se comprueba que la redefinicin reconcilia la reutilizacin con la extensibilidad:
Es habitual hacer cambios cuando se reutiliza un cdigo.
Un mtodo es una redefinicin si tiene la misma signatura (nombre y parmetros) que un mtodo de la clase padre:
Si se cambia el tipo de los parmetros se est sobrecargando el mtodo heredado.
Curso 2010/2011 Programacin Orientada a Objetos 35
Restringir la herencia
Es seguro permitir que los subtipos redefinan cualquier mtodo? La redefinicin incorrecta del algoritmo del mtodo liquidar() podra comprometer la consistencia y seguridad de la aplicacin. 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 abiertocerrado?
Curso 2010/2011 Programacin Orientada a Objetos 36
Restringir la herencia
public class Deposito { public final double liquidar() { return getCapital() + getIntereses(); } }
El algoritmo del mtodo liquidar es el mismo para todos los depsitos, no se puede redefinir.
Curso 2010/2011
37
38
Niveles de visibilidad
En Java, los niveles de visibilidad son incrementales
public
Curso 2010/2011
39
40
Polimorfismo
Capacidad de una entidad (atributo, variable, parmetro) de referenciar en tiempo de ejecucin a objetos de diferentes clases. Es restringido por herencia. Fundamental para escribir cdigo genrico reutilizable. El polimorfismo implica que una entidad tiene un tipo esttico (declarado) y otro dinmico (al que referencia la entidad).
Curso 2010/2011 Programacin Orientada a Objetos 41
Tipo dinmico:
Tipo correspondiente a la clase del objeto conectado a la entidad en tiempo de ejecucin.
Ejemplo:
A B D E C F
A oa; B ob; C oc; 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}
42
Curso 2010/2011
Polimorfismo
Asignacin polimrfica:
1. Deposito deposito = new Deposito(); 2. DepositoPenalizable penalizable = new DepositoPenalizable(); // Asignacin polimrfica 3. deposito = penalizable;
La variable deposito tiene como tipo esttico Deposito. El tipo dinmico de la variable cambia:
Lnea 1: clase Deposito. Lnea 3: clase DepositoPenalizable.
Curso 2010/2011
43
Beneficios: fiabilidad, legibilidad y eficiencia. Inconveniente: se aplica una poltica pesimista que a veces rechaza cdigo que tiene sentido.
Curso 2010/2011 Programacin Orientada a Objetos 44
Compatibilidad de tipos
Una clase (tipo) B es compatible con otra clase A si B es descendiente de A:
DepositoEstructurado es compatible con Deposito. DepositoGarantizado es compatible con Deposito y DepositoEstructrado. DepositoEstructurado NO es compatible con DepositoPenalizable.
Curso 2010/2011
45
Compatibilidad de tipos
Una asignacin polimrfica es vlida si el tipo esttico de la parte derecha es compatible con el tipo esttico de la parte izquierda:
Deposito deposito = new DepositoEstructurado(); DepositoPenalizable penalizable = new DepositoPenalizable(); // Asignacin polimrfica vlida deposito = penalizable; // Asignacin polimrfica no vlida DepositoGarantizado garantizado = penalizable;
Curso 2010/2011 Programacin Orientada a Objetos
46
Compatibilidad de tipos
Mtodo polimrfico: un paso de parmetros es vlido si el tipo esttico del parmetro real es compatible con el tipo esttico del parmetro formal.
public double indiceRentabilidad(Deposito deposito) { return deposito.getIntereses()/deposito.getCapital(); }
Validez de mensajes
La herencia es consistente con el sistema de tipos. Sobre una variable cuyo tipo esttico es DepositoEstructurado podemos aplicar:
Mtodos heredados y redefinidos: getIntereses(), getPlazoDias(), etc. Mtodos propios: getCapitalVariable(), etc.
Curso 2010/2011
48
Validez de mensajes
Deposito deposito = new Deposito(); DepositoEstructurado estructurado = new DepositoEstructurado(); estructurado.liquidar(); //OK HEREDADO DE DEPOSITO estructurado.getCapital(); //OK METODO REDEFINIDO estructurado.getCapitalVariable(); //OK MTODO PROPIO deposito = estructurado; deposito.getIntereses(); deposito.getCapitalVariable(); //OK METODO DE DEPOSITO //ERROR COMPILACION!
Curso 2010/2011
49
Deposito deposito; DepositoPenalizable penalizable = new ; deposito = penalizable; deposito.isPenalizado(); // Error de compilacin
Curso 2010/2011 Programacin Orientada a Objetos
50
Ligadura dinmica
Qu versin del mtodo getCapital() se ejecutara?
Deposito deposito; if (clientePreferente) deposito = new DepositoGarantizado(...); else deposito = new DepositoPenalizable(...); deposito.getCapital();
Curso 2010/2011
51
Ligadura dinmica
La versin de un mtodo en una clase es la introducida por la clase (redefinida) o la heredada. Versiones del mtodo getCapital():
Versin Deposito: el mtodo es definido en Depsito La clase DepositoPenalizable lo hereda. Versin DepositoEstructurado: la clase
Ligadura dinmica
public double posicionGlobal(Deposito[] depositos) { double posicion = 0; for (Deposito deposito : depositos) { posicion += deposito.getCapital(); } return posicion; }
Curso 2010/2011
53
Ligadura dinmica
El mtodo getCapital() aplicado sobre una referencia de tipo esttico Deposito puede adoptar dos versiones.
La misma llamada a un mtodo puede tener distintas interpretaciones. Para que funcione la ligadura dinmica es necesario que la variable sobre la que se aplica el mtodo sea polimrfica (en Java siempre es as).
Curso 2010/2011
54
Ligadura dinmica
A redefine f {f} B C redefine f D {f} {f}
Qu versin se ejecuta? A oa; B ob = new B(); D od = new D(); oa = ob; oa.f(); oa = od; oa.f();
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.
Curso 2010/2011 Programacin Orientada a Objetos 55
Mtodo polimrfico
Mtodo que puede recibir distintos tipos de argumentos manteniendo el mismo comportamiento. La ejecucin correcta se determina en tiempo de ejecucin aplicando ligadura dinmica.
public double indiceRentabilidad(Deposito deposito) { return deposito.getIntereses()/deposito.getCapital(); }
Curso 2010/2011
56
Curso 2010/2011
57
Curso 2010/2011
58
Clase Object
El lenguaje Java define la clase Object como raz de la jerarqua de todas las clases del lenguaje. Todas las clases heredan directa o indirectamente de la clase Object:
Si una clase no hereda de ninguna otra, el compilador aade extends Object a su declaracin.
Una variable de tipo Object puede apuntar a cualquier tipo del lenguaje:
Objetos creados a partir de clases. Tipos primitivos gracias al autoboxing.
Curso 2010/2011
59
Curso 2010/2011
61
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.
Curso 2010/2011
62
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.
Curso 2010/2011
63
123456 100000
Curso 2010/2011
64
123456 100000
Curso 2010/2011
65
326457 100000
100000
-5000 10000
66
Igualdad de objetos
El operador == se utiliza para consultar la identidad de referencias dos referencias son idnticas si contienen el mismo oid.
b a c
uno 23 uno 23
d
dos 23
Mtodo equals
La implementacin en la clase Object consiste en comprobar la identidad del objeto receptor y el parmetro.
public boolean equals(Object obj) { return this == obj; }
Por tanto: a.equals(b); // False 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.
Curso 2010/2011 Programacin Orientada a Objetos 69
Tipos de 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.
Curso 2010/2011
70
Curso 2010/2011
71
@Override public String toString() { return getClass().getName() + "[codigo = " + codigo + ", titular = "+ titular + ", saldo = "+saldo+ ",ultimasOperaciones = " + ultimasOperaciones + "]"; }
Curso 2010/2011
72
En el seminario 2 se desarrolla un ejemplo de jerarqua de herencia en el que se implementan los mtodos de la clase Object.
Curso 2010/2011
73
La clase raz tambin permite incluir las caractersticas comunes a toda la jerarqua.
Curso 2010/2011 Programacin Orientada a Objetos 74
Caso de estudio
Motivacin: Cmo podemos establecer el tipo de inters variable sobre todos los depsitos estructurados? En la aplicacin almacenamos todos los depsitos en un array:
Deposito[] depositos;
Una posicin del array puede apuntar a cualquier tipo de depsito (estructura de datos polimrfica). Sobre una referencia de tipo esttico Deposito slo puedo aplicar mtodos de esa clase. Solucin: casting (narrowing).
Curso 2010/2011
75
Casting
El compilador permite hacer un casting de una variable polimrfica a uno de los posibles tipos dinmicos de la variable. Sera posible hacer un casting al tipo DepositoEstructurado que tiene el mtodo para establecer el tipo de inters variable:
public void setTipoInteresVariable(double tipo, Deposito[] depositos) { for (Deposito d : depositos) { DepositoEstructurado de = (DepositoEstructurado) d; de.setTipoInteresVariable(tipo); } }
Curso 2010/2011 Programacin Orientada a Objetos 76
Operador instanceof
Problema:
Todos los depsitos no son estructurados. El casting se resuelve en tiempo de ejecucin y si es incorrecto aborta el programa.
No es lo mismo preguntar por compatibilidad de tipos que por la clase del objeto: getClass().
Curso 2010/2011 Programacin Orientada a Objetos 77
Operador instanceof
public void setTipoInteresVariable(double tipo, Deposito[] depositos) { for (Deposito d : depositos) { if (d instanceof DepositoEstructurado) { DepositoEstructurado de = (DepositoEstructurado) d; de.setTipoInteresVariable(tipo); } } }
Curso 2010/2011
78
public void setTipoInteresVariable(double tipo, Deposito[] depositos) { for (Deposito d : depositos) { if (d.getClass() == DepositoEstructurado.class) { }
Curso 2010/2011
79
Clases abstractas
Motivacin:
En la aplicacin bancaria observamos que tanto las cuentas como los depsitos tienen dos caractersticas en comn: tienen un titular y pagan impuestos.
Identificamos el concepto Producto Financiero y definimos una clase que sea padre de Deposito y Cuenta (Generalizacin). Se realiza la refactorizacin del cdigo de las clases Deposito y Cuenta para subir la funcionalidad relativa al titular a la nueva clase. Adems se introduce el mtodo getImpuestos() que calcula los impuestos como el 18% del beneficio del producto.
Curso 2010/2011 Programacin Orientada a Objetos 80
Jerarqua de herencia
Curso 2010/2011
81
Clase ProductoFinanciero
public class ProductoFinanciero { private Persona titular; public ProductoFinanciero(Persona titular) { this.titular = titular; } public Persona getTitular() { return titular; } public double getImpuestos() { return getBeneficio() * 0.18; } }
Curso 2010/2011 Programacin Orientada a Objetos 82
Clases abstractas
Cmo se calcula el beneficio de un producto financiero? Tiene sentido incluir una implementacin por defecto que retorne cero? El mtodo getBeneficio() no puede ser implementado en la clase ProductoFinanciero. El mtodo getBeneficio() es abstracto. Es responsabilidad de las subclases implementarlo adecuadamente. La clase ProductoFinanciero es abstracta, ya que tiene un mtodo abstracto.
Curso 2010/2011 Programacin Orientada a Objetos 83
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(); }
Curso 2010/2011
84
Jerarqua de herencia
Curso 2010/2011
85
Clases abstractas
Una clase abstracta define un tipo, como cualquier otra clase. Sin embargo, no se pueden construir objetos de una clase abstracta. Los constructores slo tienen sentido para ser utilizados en las subclases. Justificacin de una clase abstracta:
declara o hereda mtodos abstractos y/o representa un concepto abstracto para el que no tiene sentido crear objetos: un objeto producto financiero o figura geomtrica?
Curso 2010/2011 Programacin Orientada a Objetos 86
Limitaciones de la herencia
La compatibilidad de tipos que proporciona la herencia resulta til: mtodos genricos, variables y estructuras polimrficas, etc. Los tipos que representa una clase son:
El tipo que define la clase. El tipo de cada uno de sus ascendientes.
La herencia simple limita el nmero de tipos que pueden representar los objetos de una clase.
Curso 2010/2011 Programacin Orientada a Objetos
88
Limitaciones de la herencia
Clase totalmente abstracta: slo declara mtodos abstractos. Por definicin, una clase define:
Mdulo: cdigo que implementa un TAD. Tipo: define un nuevo tipo de datos.
Una clase totalmente abstracta no tiene cdigo: se pierde la naturaleza de mdulo. Slo define un tipo de datos
Curso 2010/2011
89
Limitaciones de la herencia
Una clase que hereda de otra totalmente abstracta:
No reutiliza cdigo, slo la exigencia de implementar mtodos (implementar un tipo)
La herencia simple est motivada por los problemas en la reutilizacin de cdigo: atributos repetidos, colisin de mtodos, etc. Podramos heredar de ms de una clase totalmente abstracta? Solucin: interfaces
Curso 2010/2011 Programacin Orientada a Objetos 90
Interfaces
Construccin proporcionada por Java para la definicin de tipos (sin implementacin). Equivale a una clase totalmente abstracta y aporta ventajas. Se dice que una clase implementa una interfaz. El nmero de interfaces que puede implementar una clase no est limitado (implementacin mltiple de interfaces). Los tipos que representan los objetos de una clase pueden ser ampliados con la implementacin de interfaces.
Curso 2010/2011 Programacin Orientada a Objetos
91
Interfaz Amortizable
Ejemplo: un deposito es amortizable si permite rescatar parte del capital antes del vencimiento. Se define este tipo de depsitos como una interfaz.
Curso 2010/2011
92
Interfaz Amortizable
Por defecto, en una interfaz la visibilidad de las declaraciones es pblica. Las interfaces pueden incorporar declaraciones (simplificadas) de constantes:
public interface Amortizable { double LIMITE = 10000.0; boolean amortizar(double cantidad); }
Curso 2010/2011
93
Interfaces
Curso 2010/2011
95
Extensin de interfaces
Una interfaz puede extender otras interfaces:
public interface Flexible extends Amortizable, Incrementable { void actualizarTipoInteres(double tipo); }
Curso 2010/2011
96
Interfaces Resumen
Las interfaces definen tipos que deben ser implementados por clases.
Amortizable deposito = new DepositoPenalizable();
Si una clase no implementa algn mtodo de una interfaz debe declararse abstracta. Una interfaz define un tipo, pero no se pueden construir objetos de una interfaz:
Amortizable deposito = new Amortizable(); // Error
Curso 2010/2011
97
Seminarios 2 y 3
Este tema se completa con los seminarios 2 y 3. El seminario 2 trata:
Conceptos bsicos de la herencia. Polimorfismo. Herencia y sistema de tipos. Ligadura dinmica. Mtodos de la clase Object: igualdad, copia, etc. Pruebas y herencia
El seminario 3 trata:
Clases abstractas. Interfaces.
Curso 2010/2011 Programacin Orientada a Objetos
99