Documentos de Académico
Documentos de Profesional
Documentos de Cultura
ndice
Introduccin
Herencia y Ocultamiento de la Informacin
Redefinicin de caractersticas
Herencia y creacin
Polimorfismo
Herencia y Sistema de tipos
Ligadura dinmica
Clase Object
Genericidad y Herencia
Clases abstractas
Genericidad restringida
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
Polgonos y Rectngulos
Herencia
10
Polgonos y Rectngulos
pueden
Herencia
11
}
Tema 3
Herencia
12
/**
* Desplaza a horizontalmente y b verticalmente
*/
public void trasladar (double a, double b){
for (Punto pto : vertices)
pto.trasladar(a,b);
}
/**
* Rota el ngulo alrededor del centro
*/
public void rotar (Punto centro, double angulo){
for (Punto pto : vertices)
pto.rotar(centro, angulo);
}
Tema 3
Herencia
13
/**
* Suma las longitudes de los lados
*/
public double perimetro(){
double total = 0;
Punto anterior;
Punto actual = vertices.get(0);
for (int index = 1; index < numVertices; index++){
anterior = actual;
actual = vertices.get(index);
total = total + actual.distancia(anterior);
}
total=total+actual.distancia(vertices.get(0));
return total;
}
Tema 3
Herencia
14
Clase Rectangulo
public class Rectangulo extends Poligono{
private double lado1, lado2;
//Nuevos atributos
private double diagonal;
public Rectangulo(List<Punto> vertices,
double lado1, double lado2){
super(vertices);
this.lado1 = lado1;
this.lado2 = lado2;
}
@Override //Redefine permetro
public double perimetro(){
return (2*(lado1 + lado2 ));
}
public double diagonal() {//Nuevos mtodos
return Math.sqrt(lado1*lado1 + lado2*lado2);
}
}
Tema 3
Herencia
15
Clase Rectngulo
Rectangulo.trasladar(0.0,0.0);
Atributos: lado1, lado2
Constructor que invoca al constructor de Poligono
Mtodos: diagonal
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
Acceso protegido
Herencia
18
De ms restrictivo a menos:
private
protected
public
Tema 3
Herencia
19
Redefinicin
Tema 3
Herencia
20
Redefinicin de mtodos
Mejorar implementacin.
Refinamiento:
Tema 3
Herencia
21
Refinamiento: super
super.met();
Se rompe la ligadura dinmica
No slo se utiliza en los mtodos redefinidos
Tema 3
Herencia
22
Ejemplo super
public class CuentaAhorro extends Cuenta{
Tema 3
Herencia
23
Adaptaciones al redefinir
Slo si se relaja
Tema 3
24
Herencia
25
Polimorfismo
Polimorfismo
Polimorfismo
Polimorfismo
Polimorfismo
Polimorfismo
Tema 3
26
Polimorfismo de asignacin
Tema 3
27
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
28
(antes)
(despus)
Rectangulo r;
a) asignacin:
p = r;
b) paso de parmetros:
void f (Poligono p){
...
}
-- f es un mtodo polimrfico
(polimorfismo puro)
Herencia
29
Polimorfismo de asignacin
1. Poligono poligono = new Poligono();
2. Rectangulo rectangulo = new Rectangulo();
3. poligono = rectangulo;
//Asignacin polimrfica
Tema 3
Herencia
30
Funciones polimrficas:
Herencia
31
Polimorfismo puro:
Sobrecarga:
Tema 3
Herencia
32
C
E
Herencia
33
Reglas bsicas:
Beneficios esperados:
Fiabilidad
Legibilidad
Eficiencia
Tema 3
Herencia
34
i=d;
i= 0.0;
Funcionar
i= -3.67;
No funcionara
i= 3.67 - 3.67; Funcionara
Tema 3
Herencia
35
Herencia
36
Mensajes ilegales:
Mensajes legales:
p.perimetro(); p.getVertices() ;
p.trasladar(..); p.rotar (..);
r.getDiagonal();r.getLado1();
r.getLado2();
r.getVertices(); r.trasladar(..);
r.rotar (..); r.perimetro();
Tema 3
Herencia
p.getLado1();
p.getLado2();
p.getDiagonal();
37
Tema 3
Herencia
38
Ejemplo
Poligono p; Rectangulo r; Triangulo t;... double x;
Figura
Figura
Abierta
Segmento
x = p.perimetro();
x = r.perimetro();
x = r.getDiagonal();
if (test) p = r
else p = t
x = p.perimetro();
Figura
Cerrada
Poligono
Elipse
Triangulo Rectangulo
Circulo
SERA INCORRECTO
x = p.getDiagonal();
r = p;
Cuadrado
Tema 3
Herencia
39
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
40
Ligadura dinmica
=
=
=
=
p.perimetro()
r.perimetro()
r;
p.perimetro()
Tema 3
perimetroPOLIGONO
perimetroRECTANGULO
perimetroRECTANGULO
Herencia
41
{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
42
Ligadura Dinmica
Ejemplo 2: void visualizar (Figura [] figuras){
for (Figura figura : figuras)
figura.dibujar();
}
Qu sucede si aparece un nuevo tipo de figura?
Herencia
43
Uno
Dos
Herencia
Tres
Cuatro
44
Tema 3
Herencia
1
1
2
2
2
4
2
4
2
2
45
Cdigo genrico
Herencia
46
...
}
B
C
{met2}
{met2}
Tema 3
47
{met2}
{met2}
Tema 3
Herencia
48
Herencia
49
Clase Object
Herencia
OK!!
50
Clonacin de objetos
Igualdad de objetos
Tema 3
Herencia
51
Copia de objetos
Herencia
52
Tipos de copia
Tipos de copia:
Tema 3
Herencia
53
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
54
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
55
copia
titular
codigo
123456
326457
titular
codigo
saldo
100000
100000
saldo
ultOper
ultOper
-5000
10000
-5000
10000
J. Gomez
87654321
Tema 3
Herencia
56
Igualdad de objetos
//false si a!=b
Herencia
57
Igualdad
Tipos de igualdad:
Herencia
58
Mtodos Object
Tema 3
Herencia
59
Tema 3
Herencia
60
}
public class Lista{
private Nodo cabeza;
Herencia
61
Herencia
62
Herencia
63
Figura[] fig;
ArrayList <Figura> fig;
Poligono p;
Rectangulo r;
Circulo c;
Triangulo t;
//se crean
fig.add(0,p);
fig.add(1,r);
fig.add(2,c);
fig.add(3,t);
...
Tema 3
fig
1
2
3
4
Herencia
64
Genericidad y polimorfismo
Tema 3
Herencia
65
Herencia
66
Ejemplo
public float maxDiagonal (LinkedList<Figura> listaFig) {
Figura f;
double actual,result=-1;
for (Figura figura : listaFig){
if (figura instanceof Rectangulo){
actual = (Rectangulo)figura.getDiagonal();
if (actual>result) result = actual;
}
}
return result;
}
Tema 3
Herencia
67
Operador instanceof
Herencia
68
}
public void put(T v, int index){
Se pueden sumar dos
objetos de tipo T?
}
public Vector<T> suma (Vector<T> otro){
Vector<T> result = new Vector<T>();
for (int i=1; i <= count; i++)
result.put(this.item(i) + other.item(i),i);
return result;
Es posible ampliar el n de
}
operaciones?
}
Tema 3
Herencia
69
Ejemplos:
class Vector <T extends Number>
class Dictionary <G, H extends Comparable>
class ListaOrdenada <T extends Comparable &
Serializable>
Tema 3
Herencia
70
Genericidad restringida
public FiguraCompueta<T extends Poligono>{
private List<T> contenido;
public void dibujar(){
for (T poligono : contenido)
poligono.dibujar();
}
}
Herencia
71
Genericidad Restringida
Vector<Number>
Vector<T extends Number>
?
Tema 3
Herencia
72
Son equivalentes?
class FiguraCompuesta<T extends Poligono>{
private T [] contenido;
public void insertar(T p){
...
}
...
}
public class FiguraCompuesta{
private Poligono[] contenido;
public void insertar(Poligono p){
...
}
...
}
Tema 3
Herencia
73
Tema 3
Herencia
74
Rectangulo
List<Poligono>
No hay
relacin
List<Rectangulo>
List<Poligono> lp;
List<Rectangulo> lr = new ;
lp = lr; //ERROR en tiempo de compilacin
Tema 3
Herencia
75
Herencia
76
Tema 3
Herencia
//COMPILA!!
77
Tipos comodn
Herencia
78
Tipos comodn
void imprimir (List<? extends Poligono> poligonos)
Herencia
79
puro
Tema 3
Herencia
80
Clases abstractas
Sea la declaracin
Figura f; Poligono p;
y el cdigo
p = new Poligono();
f = p;
f.dibujar();
Sera legal?
Herencia
81
Figura*
Abierta
+
Segmento
En Figura:
abstract void dibujar();
Figura*
Cerrada
+
Poligono
Elipse+
+ Rectangulo
+
Triangulo
Circulo+
Clases abstractas
+
Cuadrado
Herencia
82
Clases abstractas
Herencia
83
Herencia
84
Tema 3
Herencia
85
Array
ListaEnlazada
FicheroSec
comenzar
fin
avanzar
item
comenzar
fin
avanzar
item
comenzar
fin
avanzar
item
Tema 3
Herencia
86
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
87
Array<Integer> a;
a = new Array();
a.buscar(31);
Array
Tema 3
ListaEnlazada
FicheroSec
Herencia
88
Implementacin de Acciones
Tema 3
Herencia
89
Coleccion
buscar
condicion
C1
C2
C3
condicion
condicion
condicion
Tema 3
Herencia
No!?
90
Problemas de la solucin:
Alternativa:
Tema 3
Herencia
91
Coleccion
ICondicion
buscar
test
C1
Tema 3
Herencia
C2
C3
92
Tema 3
Herencia
93
Interfaces en Java
Herencia
94
Interfaz ICondicion
Herencia
95
Implementacin de la Interfaz
Herencia
96
Coleccion<Cuenta> cuentas;
cuentas.buscar(new CondicionSaldoSuperior(60000));
Tema 3
Herencia
97
Acciones annimas
Coleccion<Cuenta> cuentas;
cuentas.buscar(new ICondicion<Cuenta>(){
@Override
public boolean test (Cuenta cuenta){
return cuenta.getSaldo() > 60000;
}
});
Tema 3
Herencia
98
Acciones annimas
Coleccion<Cuenta> cuentas;
Tema 3
Herencia
99
Coleccion
interface
criterio
Comparator<T>
int compare(T o1, T o2)
OrdenAlfabetico
OrdenSaldo
ColeccionOrdenada<Cuenta> cuentas;
cuentas = new ColeccionOrdenada<Cuenta> (new OrdenAlfabetico());
Herencia
100
met
accion
met
interface
IA
accion
C1
C2
C3
A1
A2
A3
accion
accion
accion
accion
accion
accion
a) Mtodo plantilla
Tema 3
b) Composicin
Herencia
101
met
accion
met(IA ca)
IA
accion
C1
C2
C3
A1
A2
A3
accion
accion
accion
accion
accion
accion
a) Mtodo plantilla
Tema 3
b) Composicin
Herencia
102
interface
IA
IA ca
met
accion
accion
met()
C1
C2
C3
A1
A2
A3
accion
accion
accion
accion
accion
accion
a) Mtodo plantilla
Tema 3
b) Composicin
Herencia
103
Iteradores
Herencia
104
Iteradores internos
Herencia
105
B.
Tema 3
Herencia
106
Iteradores internos
coleccion
IteradorLineal<T>
Coleccion<T>
doIf
forEach
accion
test
void doIf(){
for (T item: coleccion)
if (test(item))
accion(item);
}
Tema 3
Mtodo plantilla!!
Herencia
107
Iteradores internos
coleccion
IteradorLineal<T>
Coleccion<T>
doIf
forEach
accion
test
void forEach(){
for (T item: coleccion)
accion(item);
}
Mtodo plantilla!!
Tema 3
Herencia
108
Iteradores internos
Herencia
109
Iteradores internos
coleccion
IteradorLineal<T>
Coleccion<T>
doIf
forEach
accion
test
void accion(Cuenta cta){
sysout(cta.getTitular());
}
IteradorMorosos
accion
test
}
Tema 3
Herencia
110
Iteradores internos
}
Tema 3
Herencia
111
Iterador interno:
Iterador externo:
Tema 3
Herencia
112
Herencia
113
Interfaz Iterator<T>:
Tema 3
Herencia
114
Iteradores
Tema 3
Herencia
115
Herencia
116
Clases internas
Tema 3
Herencia
117
}
}
Tema 3
Herencia
118
Colecciones en Java
Tema 3
Herencia
119
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
120
Herencia mltiple
Qu proporciona la herencia?
Herencia
121
Herencia mltiple
Motivacin:
Deposito
titular
plazoDias
tipoInteres
liquidar
getIntereses
CuentaRemunerada
Tema 3
Herencia
122
Herencia mltiple
Herencia
123
IDeposito
Barco
implements
Deposito
Cuenta
extends
CuentaRemunerada
Herencia
124
IDeposito
Barco
extends
implements
Deposito
Tema 3
depositoImpl
CuentaRemunerada
Herencia
125
Herencia
126
Herencia
127
Tema 3
Herencia
128
Herencia Mltiple
public class CuentaRemunerada extends Cuenta
implements IDeposito {
Tema 3
Herencia
129
Tema 3
Herencia
130
Herencia
131
Herencia
132