Documente Academic
Documente Profesional
Documente Cultură
Programacin genrica
Objetivo:
9 escribir algoritmos genricos, independientes de las clases
concretas de los datos (objetos) empleados.
Ejemplos:
9 Algoritmos tpicos: Ordenacin, bsqueda,....
9 Estructuras de datos (contenedores): Listas, colas, vectores,...
1 aproximacin: Cualquier objeto es Object describir los
algoritmos en funcin de esta clase.
Ejemplo: CeldaMemoria
Permite
Permitealmacenar
almacenarun
unobjeto
objeto
de
decualquier
cualquierclase
clase
class CeldaMemoria {
public Object leer () {
return ( _valor );
}
public void escribir (Object x) {
_valor = x;
}
private Object _valor;
}
Es
Estransformado
transformado
automticamente
automticamenteaaObject
Object
upcasting
upcasting
Es
Estransformado
transformado
automticamente
automticamenteaaObject
Object
upcasting
upcasting
Devuelve
DevuelveObject
Object, ,es
espreciso
preciso
transformarlo
EstoNO
NO
transformarloaaInteger
Integer.. Esto
es
esautomtico
automtico
downcasting
downcasting
Hay
Hayque
queinterpretar
interpretaradecuadamente
adecuadamenteelel
Object
Objectextrado.
extrado.
Object
Object puede
puedeser
serdevuelto
devueltopor
porun
un
mtodo
mtodo
Intentamos
Intentamosgeneralizarlo
generalizarlopara
para
poder
calcular
poder calcularelelmximo
mximode
de22
Objetos.
Objetos.
class Utilidades {
public static Object maximo ( Object a, Object b ) {
if ( a > b ) return ( a );
else return ( b );
}
}
Es
Esfactible?
factible?
10
NO
NO
class Utilidades {
public static Object maximo ( Object a, Object b ) {
if ( a > b ) return ( a );
Se
Seasume
asumeque
quedos
dosObject
Objectse
sepueden
pueden
else return ( b );
comparar
con
el
operador
>,
}
comparar con el operador >,pero
peroesto
estoes
es
falso.
falso.
ElEloperador
estdefinido
definidopara
paraesta
esta
operador>> NO
NOest
clase.
clase.
11
ElElrequisito
requisitopara
paraque
queelelmtodo
mtodofuncione
funcionees
esque
que
MI_CLASE
MI_CLASEposea
poseaun
unmtodo
mtodocon
conlalasignatura:
signatura:
public
public boolean
boolean mayorQue
mayorQue (MI_CLASE
(MI_CLASE x)
x)
12
Interfaces
En Java la interface es la clase ms abstracta que existe.
Consiste slo en:
9 Mtodos pblicos y abstractos.
9 Atributos pblicos y finales (Constantes).
Se dice que una clase implementa un interfaz si define TODOS
los mtodos abstractos de la interfaz.
class miClase implements miInterfaz
Interfaz:
9 Especifica requisitos que debe cumplir una clase que lo
implemente.
9 No incluye ningn detalle de implementacin.
Lenguajes de Programacin - Orientacin a Objetos: Progr. Genrica
13
Especificacin de un interfaz
interface Comparable {
boolean mayorQue ( Comparable x );
}
No
Nohace
hacefalta
faltaindicar
indicarque
queelelmtodo
mtodoes
es
public
y
abstract.
public y abstract.
No
Nopuede
puedeser
serde
deotra
otramanera.
manera.
Establece
Estableceelelrequisito
requisitode
deque
quese
sedefina
definaelelmtodo:
mtodo:
public
public boolean
boolean mayorQue
mayorQue (Comparable
(Comparable x)
x)
en
encualquier
cualquierclase
claseque
quedesee
deseecumplir
cumplir(implementar)
(implementar)este
esteinterfaz.
interfaz.
14
Este
Esterequisito
requisitose
secumple
cumplesiempre
siempreen
encualquier
cualquierclase
claseque
que
implemente
Comparable.
implemente Comparable.
15
Implementacin de interfaces
class Complejo implements Comparable {
//Constructores
public Complejo (double x, double y) {...}
public Complejo () {...}
//Mtodos propios
public double
public double
public double
//Redefiniciones de Object
public String toString () {...}
public boolean equals ( Object x ) {...}
//Implementacion del interfaz Comparable
public boolean mayorQue ( Comparable arg ) {
if ( this.modulo() > ((Complejo) arg).modulo() ) return ( true );
else return ( false );
}
//Implementacion: privado
private double _p_real;
private double _p_imag;
}
Lenguajes de Programacin - Orientacin a Objetos: Progr. Genrica
16
Utilizacin
Utilizacindel
delalgoritmo
algoritmogenrico
genrico
a = 5.4-67.0i , 67.21725968826756
b = 0.0 , 0.0
Maximo: 5.4-67.0i
Salida
Salidade
delalaejecucin
ejecucindel
deltest
test
Lenguajes de Programacin - Orientacin a Objetos: Progr. Genrica
17
Amplia
Amplialos
losrequisitos
requisitosaacumplir,
cumplir,aa
cambio
cambioflexibiliza
flexibilizasu
suutilizacin.
utilizacin.
18
class Utilidades {
public static Comparable maximo ( Comparable a, Comparable b ) {
// Igual que antes
}
public static Comparable minimo ( Comparable a, Comparable b ) {
// Igual que antes
}
public static void ordenacionSeleccion ( Comparable[] datos ) {
Comparable aux;
Cualquier
Cualquierarray
arrayde
deobjetos
objetosComparables.
Comparables.
int min;
for (int i = 0; i < (datos.length-1); i++) {
min = i;
for (int j = i+1; j < datos.length; j++) //busca minimo
if ( datos[j].menorQue(datos[min]) ) min = j;
if ( min != i ) { //coloca minimo en i
aux = datos[min];
datos[min] = datos[i];
datos[i] = aux;
}
}
}
}
Lenguajes de Programacin - Orientacin a Objetos: Progr. Genrica
19
20
10
Utilizacindel
delalgoritmo
algoritmogenrico
genrico
Utilizacin
Utilidades.ordenacionSeleccion ( vector );
for (int i=0; i<4; i++)
System.out.print (vector[i] + " ");
System.out.println();
}
}
10.0 9.0 8.0 7.0
7.0 8.0 9.0 10.0
Salida
Salidade
delalaejecucin
ejecucindel
deltest
test
21
22
11
Interfaz PILA
interface Pila {
void apilar ( Object x );
void desapilar ();
Requisitosque
quedebe
debecumplir
cumplir
Requisitos
cualquier
implementacin
de
cualquier implementacin de
una
Pila
una Pila
23
Implementaciones de PILA
Existen 2 posibilidades tpicas:
9 Usar un array para almacenar los datos.
9 Manejar estructuras enlazadas (listas).
<<Interface>>
Pila
apilar()
desapilar()
cima()
esVacia()
vaciar()
implements
PilaVec
datos : Object[]
laCima : int
implements
PilaPtr
laCima : nodo_pila
24
12
25
//fin Clase
26
13
Pila enlazada
class Nodo_Pila {
private Object elDato;
private Nodo_Pila elSiguiente;
public Nodo_Pila ( Object x, Nodo_Pila sig ) {
elDato = x;
elSiguiente = sig;
Loselementos
elementosque
quevan
vanaa
Los
}
public Nodo_Pila ( Object x ) {
this ( x, null );
}
constituirla
laestructura.
estructura.
constituir
27
28
14
//fin Clase
29
30
15
10,9,8,7,6,5,4,3,2,1,
}
Lenguajes de Programacin - Orientacin a Objetos: Progr. Genrica
31
32
16
Alrecuperar
recuperarhay
hayque
querealizar
realizarel
el
Al
cast
al
tipo
apropiado.
cast al tipo apropiado.
Lenguajes de Programacin - Orientacin a Objetos: Progr. Genrica
33
Seestn
estnalmacenando
almacenando
Se
tiposdiferentes.
diferentes.
tipos
int suma=0;
while (it.hasNext())
suma = suma + ((Integer)it.next()).intValue();
System.out.println(suma);
34
17
Seestn
estnalmacenando
almacenando
Se
tipos
diferentes.
tipos diferentes.
int suma=0;
while (it.hasNext())
suma = suma + ((Integer)it.next()).intValue();
System.out.println(suma);
ClassCastException: java.lang.String
at prueba.main(prueba.java:12)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
Lenguajes de Programacin - Orientacin a Objetos: Progr. Genrica
35
Especificamosque
quevamos
vamosaaalmacenar
almacenarInteger.
Integer.
Especificamos
Lenguajes de Programacin - Orientacin a Objetos: Progr. Genrica
36
18
37
*comparar
19
Nohacen
hacenfalta
falta
No
conversiones
detipos
tipos
conversiones de
39
40
20
Seest
estasumiendo
asumiendoque
quecualquier
cualquier
Se
unCeldaMemoria<Object>
CeldaMemoria<Object>
CeldaMemoria<Tipo> es
esun
CeldaMemoria<Tipo>
Lenguajes de Programacin - Orientacin a Objetos: Progr. Genrica
41
FALSO
Seest
estasumiendo
asumiendoque
quecualquier
cualquier
Se
CeldaMemoria<Tipo> es
esun
unCeldaMemoria<Object>
CeldaMemoria<Object>
CeldaMemoria<Tipo>
42
21
Siesto
estofuera
fueraposible,
posible,se
sepodra
podraalmacenar
almacenar
Si
cualquier
objeto
en
original
a
travsde
dealias.
alias.
cualquier objeto en original a travs
43
44
22
Cuando se realiza un cambio de tipo (cast), eso nos dice algo que el
programador piensa que es cierto en un punto determinado del
cdigo y la comprobacin de si el programador est en lo cierto la
realiza la mquina virtual de Java slo en tiempo de ejecucin.
class CeldaMemoria {
//...
private Object _valor;
}
45
23