Documentos de Académico
Documentos de Profesional
Documentos de Cultura
POO3 Java
POO3 Java
POO3 Java
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
Herencia
Introduccin
Independencia de la representacin
Herencia
Introduccin
EJEMPLO:
Tema 3
Herencia
Jerarquas de herencia
LIBRO
LIBRO_TEXTO
FIGURA
POLIGONO
REVISTA
INVESTIGACION MAGAZINE
CIRCULO
RECTANGULO
Herencia
Introduccin
Herencia
B hereda de A
A es la superclase y B la subclase
C hereda de B y A
Tema 3
B y C son subclases de A
B es un descendiente directo de A
C es un descendiente indirecto de A
Herencia
Tipos de herencia
A
B
D
Herencia simple
Ejemplo: Java, C#
Herencia mltiple
Tema 3
Generalizacin (Factorizacin)
Especializacin (Abstraccin)
Herencia
Tema 3
10
Herencia
11
double getCapital() {}
int getPlazoDias() {}
double getTipoInteres() {}
Persona getTitular() {}
}
Tema 3
Herencia
12
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
Tema 3
Herencia
16
Herencia y creacin
Implcita:
Explcita:
Tema 3
super(); o super(a,b); o
Dependiendo de si el constructor al que invocamos tiene o no
argumentos
Herencia
17
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
Herencia
19
De ms restrictivo a menos:
private
protected
public
Tema 3
Herencia
20
Redefinicin
Tema 3
Herencia
21
Redefinicin
Tema 3
Herencia
22
Redefinicin de mtodos
Herencia
23
Refinamiento: super
Tema 3
Herencia
24
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
Tema 3
26
Herencia
27
Herencia
28
Polimorfismo
Polimorfismo
Polimorfismo
Polimorfismo
Polimorfismo
Polimorfismo
Tema 3
29
Polimorfismo de asignacin
Herencia
30
Tipo esttico:
Tipo dinmico:
Ejemplo:
D
Tema 3
C
E
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
Polimorfismo de asignacin
1. Deposito deposito = new Deposito();
2. DepositoEstructurado estructurado =
new DepositoEstructurado();
//Asignacin polimrfica
3. deposito = estructurado;
En 1 es Deposito
En 3. es DepositoEstructurado
Tema 3
Herencia
32
Polimorfismo puro
Herencia
33
Funciones polimrficas:
Herencia
34
Polimorfismo puro:
Sobrecarga:
}
public double indiceRentabilidad(DepositoEstructurado deposito){
}
Tema 3
Herencia
35
C
E
Herencia
36
Reglas bsicas:
Beneficios esperados:
Fiabilidad
Legibilidad
Eficiencia
Tema 3
Herencia
37
i=d;
i= 0.0;
Funcionar
i= -3.67;
No funcionara
i= 3.67 - 3.67; Funcionara
Tema 3
Herencia
38
Compatibilidad de tipos
DepositoEstructurado
Herencia
39
Compatibilidad de tipos
DepositoPenalizable es
compatible con Deposito
DepositoGarantizado es
compatible con Deposito y
DepositoEstructurado
DepositoGarantizado no es
compatible con
DepositoPenalizable
Herencia
40
Compatibilidad de tipos
DepositoPenalizable penalizable =
new DepositoPenalizable();
banco.indiceRentabilidad (penalizable);
Tema 3
Herencia
41
Validez de mensajes
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();
Tema 3
Herencia
43
Ligadura dinmica
redefine f
{f} B
{f}
A oa;
oa.f(..);
qu versin de f se
ejecuta?
redefine f
D {f}
Regla de la ligadura dinmica
Herencia
44
Ligadura dinmica
//versin de Deposito
//versin de DepositoEstructurado
deposito = estructurado;
deposito.getCapital();
Tema 3
//versin de DepositoEstructurado
Herencia
45
{f}
{f} B
redefine f
A oa;
B ob = new B();
D od = new D();
oa = ob;
oa.f();
D {f}
oa = od
oa.f();
Tema 3
Herencia
46
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?
Herencia
47
Uno
Dos
Herencia
Tres
Cuatro
48
Tema 3
Herencia
1
1
2
2
2
4
2
4
2
2
49
Cdigo genrico
Herencia
50
Herencia
51
Clase Object
Herencia
OK!!
52
Clonacin de objetos
Igualdad de objetos
Tema 3
Herencia
53
Copia de objetos
Herencia
54
Tipos de copia
Tipos de copia:
Tema 3
Herencia
55
Aliasing:
incorrecto al
compartir las
ltimas
operaciones.
No deberan
tener el mismo
cdigo
Tema 3
cuenta
copia
titular
codigo
123456
123456
titular
codigo
saldo
100000
100000
saldo
ultOper
ultOper
-5000
10000
J. Gomez nombre
87654321 dni
Objeto Persona
Herencia
56
cuenta
titular
codigo
123456
123456
titular
codigo
saldo
100000
100000
saldo
ultOper
ultOper
-5000
10000
-5000
10000
J. Gomez J. Gomez
87654321 87654321
Tema 3
Herencia
57
copia
titular
codigo
123456
326457
titular
codigo
saldo
100000
100000
saldo
ultOper
ultOper
-5000
10000
-5000
10000
J. Gomez
87654321
Tema 3
Herencia
58
Igualdad de objetos
//false si a!=b
Herencia
59
Igualdad
Tipos de igualdad:
Herencia
60
Mtodos Object
Tema 3
Herencia
61
Deposito[] depositos;
List<Deposito> depositos;
Herencia
62
Casting o narrowing
Problema:
Solucin:
Herencia
63
Operador instanceOf
Tema 3
Herencia
64
deposito.getClass()==DepositoEstructurado.class
Herencia
65
Object
Tema 3
Herencia
66
Object
class Nodo{
private Object valor;
private Nodo siguiente;
}
public class Lista{
private Nodo cabeza;
Herencia
67
Object
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
Herencia
69
Genericidad en Java
Herencia
70
Herencia
71
Tema 3
Herencia
72
Genericidad restringida
public class CarteraAhorro<T extends Deposito>{
private List<T> contenido;
public void liquidar(){
for (T deposito : contenido)
deposito.liquidar();
}
}
Herencia
73
Genericidad Restringida
List
List<T extends Object>
CarteraAhorro<Deposito>
CarteraAhorro<T extends Deposito>
?
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
No hay
relacin
List<Deposito>
List<DepositoEstructurado>
List<Deposito> depositos;
List<DepositoEstructurado> estructurados =
new LinkedList<DepositoEstructurado>();
depositos = estructurados; //ERROR en tiempo de compilacin
Tema 3
Herencia
77
List lista;
lista = new LinkedList<Deposito>();
// compila
lista = new LinkedList<DepositoEstructurado>(); // compila
lista.add(POO);
// compila!!
Tema 3
Herencia
78
Tema 3
Herencia
//COMPILA!!
79
Herencia
80
Herencia
81
puro
Tema 3
Herencia
82
Clases abstractas
Tema 3
Herencia
83
Tema 3
ProductoFinanciero es
una clase abstracta
El mtodo getBeneficio es
un mtodo abstracto
Herencia
84
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
Herencia
86
Mtodo Plantilla!!
Herencia
87
No incluye implementacin
Solucin: Interfaces
Tema 3
Herencia
88
Interfaces en Java
Tema 3
Herencia
89
Ejemplo de Interfaz
Herencia
90
Tema 3
Herencia
91
Interfaz Amortizable
Tema 3
Herencia
92
Herencia
93
Colecciones en Java
Tema 3
Herencia
94
Iterator
devuelve
Collection
Map
devuelve
ListIterator
List
Set
AbstractCollection
AbstractList
TreeMap
AbstractMap
HashMap
AbstractSet
HashSet
ArrayList
SortedSet
SortedMap
TreeSet
AbstractSequentialList
extends
implements
interface
class
LinkedList
Tema 3
Herencia
95
Iteradores en Java
Herencia
96
Iteradores en Java
Herencia
97
Iteradores en Java
Interfaz Iterator<T>:
Tema 3
Herencia
98
Herencia
99
Clases internas
Tema 3
Herencia
100
}
}
Tema 3
Herencia
101
Patrones de diseo
Mtodo Plantilla
Patrn Estrategia
Patrn Composite
Tema 3
Herencia
102
Mtodo Plantilla
Herencia
103
Mtodo Plantilla
Tema 3
Herencia
104
Mtodo Plantilla
Tema 3
Herencia
105
Mtodo plantilla
public abstract class ProductoFinanciero {
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
Herencia
109
Herencia
110
Herencia
111
Herencia
112
Herencia
113
Tema 3
Herencia
114
Estrategias 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
Herencia
116
Herencia
117
Patrn Composite
Tema 3
Herencia
118
Tema 3
Herencia
119
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?
Herencia
122
Herencia mltiple
Motivacin:
Tema 3
Herencia
123
Herencia mltiple
Herencia
124
Interfaz IDeposito
Tema 3
Herencia
125
Herencia
126
Tema 3
Herencia
127
Herencia
128
Herencia
129
Tema 3
Herencia
130
Herencia Mltiple
public class CuentaRemunerada extends Cuenta
implements IDeposito {
Tema 3
Herencia
131
Tema 3
Herencia
132
Herencia
133
Herencia
134