Sie sind auf Seite 1von 11

Ligadura dinmica mediante mtodos abstractos

La llamada a los mtodos de las clases derivadas que son una redefinicin de un mtodo
abstracto se hace de igual forma que cualquier otro mtodo de la clase. Considrese la
siguiente jerarqua de clases:
abstract class Libro
{
abstract public int difusion();
abstract public void escribirDescripcion();
}
class LibroImpreso extends Libro
{
public int difusion() { ... }
public void escribirDescripcion(){ ... }

}
class LibroElectronico extends Libro
{
public int difusion(){ ... }
public void escribirDescripcion(){ ... }
}

Y la llamada a los mtodos a travs de una referencia a Libro, tal como :
final int numLibros = 11;
Libro ! " = ne" LibronumLibros!; ##referencias a 11 ob$etos libro
## creacci%n de ob$etos libro impreso o electr%nico
"&! = ne" LibroImpreso('La lo(ica de lo impensable')1**)+,.&);
"1! = ne" LibroElectronico('-atarsis')..&);
## escribe la descripci%n de cada tipo de libro
for (int i = & ; i / numLibros; i00)
"i!.escribirDescripcion();
En estas llamadas ava no !uede determinar cu"l es la im!lementacin es!ecfica del
mtodo escribirDescripcion() que se ha de llamar. #e determina en tiem!o de
ejecucin, es la ligadura dinmica o vinculacin tarda, seg$n el objeto %LibroImpreso
o LibroElectronico) al que referencie "i!.
Norma
&na referencia a una clase derivada es tambin una referencia a la clase base. #e !uede
utili'ar una variable referencia a la clase base, en lugar de una referencia a cualquier
clase derivada, sin una conversin e(!lcita de ti!os.
EJERCICIO 1
Se declaran la clase base abstracta A, con un mtodo abstracto y otro no. Las clases
derivadas de A redefinen el mtodo abstracto. En main() se crean obetos y se asignan a
una variable de la clase A.
abstract class 1
{
public abstract void dinamica();
public void estatica()
{
23stem.out.println( '45todo estatico de la clase 1');
}
}
## define clase 6) derivada de 1) redefiniendo el m5todo abstracto
class 6 extends 1
{
public void dinamica()
{
23stem.out.println( '45todo din7mico de clase 6');
}
}
## la clase - redefine el m5todo abstracto
class - extends 1
{
public void dinamica()
{
23stem.out.println( '45todo dinamico de clase -');
}
}
## clase con el m5todo main
public class Li(adura
{
static public void main(2trin( ! ar)
{
1 a;
6 b = ne" 6();
- c = ne" -();
23stem.out.print( '45todos llamados con ob$eto b desde');
23stem.out.println(' referencia de la clase 1');
a = b;
a.dinamica();
a.estatica();
23stem.out.print( '45todos llamados con ob$eto c desde');
23stem.out.println(' referencia de la clase 1');
a = c;
a.dinamica();
a.estatica();
}
}
Ejecucin
45todos llamados con ob$eto b desde referencia de la clase 1
45todo din7mico de la clase 6
45todo est7tico de la clase 1
45todos llamados con ob$eto c desde referencia de la clase 1
45todo din7mico de la clase -
45todo est7tico de la clase 1
EJERCICIO 4.1
!e"resentar la erar#ua de clases de "ublicaciones #ue se distribuyen en una librera $
revistas, libros, etc.
)odas las !ublicaciones tienen en com$n la editorial * su fecha de !ublicacin. Las
revistas tienen una determinada !eriodicidad lo que im!lica el n$mero de ejem!lares
que se !ublican al a+o, * ,!or ejem!lo, el n$mero de ejem!lares que se !onen en
circulacin controlados oficialmente %en Es!a+a la ,-.. Los libros tienen como
caractersticas es!ecficas el cdigo de /#01 * el nombre del autor.
class 8ublicacion
{
public void nombrarEditor(2trin( nomE){...}
public void poner9ec:a(lon( fe) {...}
private 2trin( editor;
private lon( fec:a;
}
class ;evista extends 8ublicacion
{
public void fi$arnumeros1n3o(int n) {...}
public void fi$ar-irculacion(lon( n) {...}
private int numeros8or1n3o;
private lon( circulacion;
}
class Libro extends 8ublicacion
{
public void ponerI26<(2trin( nota) {...}
public void poner1utor(2trin( nombre) {...}
private 2trin( isbn;
private 2trin( autor;
}
EJEMLO 4.!
Se declara una clase base con el mtodo escribe() y una clase derivada con el mismo
nombre del mtodo "ero distintos argumentos. La clase con el mtodo main() crea
obetos y reali%a llamadas a los mtodos sobrecargados de la clase derivada.
class 6ase2obre
{
public void escribe(int =)
{
23stem.out.print('45todo clase base) ar(umento entero> ');
23stem.out.println(=);
}
public void escribe(2trin( a)
{
23stem.out.print('45todo clase base) ar(umento cadena> ');
23stem.out.println(a);
}
}
class Deriv2obre extends 6ase2obre
{
public void escribe(2trin( a) int n)
{
23stem.out.print('45todo clase derivada) dos ar(umentos> ');
23stem.out.println(a 0 ' ' 0 n);
}
}
public class 8rueba2obre
{
public static void main(2trin( ! ar)
{
Deriv2obre dr = ne" Deriv2obre();
dr.escribe('-adena constante ')?&);
dr.escribe('-adena constante ');
dr.escribe(?&);
}
}
EJERCICIO 4."
&onsidrese la siguiente erar#ua$

,bj2eomtrico
Cuadrado Circulo
Las declaracin de las clases se agru!an en el !aquete fi(uras.

pac=a(e fi(uras;
public class @b$Aeometrico
{
public @b$Aeometrico(double x) double 3)
{
px = x;
p3 = 3;
}
public @b$Aeometrico()
{
px = p3 = &;
}
public void imprimir-entro()
{
23stem.out.println('(' 0 px 0 ')' 0 p3 0 ')');
}
protected double px) p3;
}
&n crculo se caracteri'a !or el centro * su radio. &n cuadrado tambin !or su centro
* uno de sus cuatro vrtices. Entoces, las clases &irculo * &uadrado se declaran
derivadas de 'b(eometrico.
pac=a(e fi(uras;
public class -irculo extends @b$Aeometrico
{
public -irculo(double x) double 3) double r)
{
super(x)3); ## llama a constructor de la clase base
radio = r;
}
public double area()
{
return 8I B radio B radio;
}
private double radio;
private final double 8I = C.1*1?D;
}
pac=a(e fi(uras;
public class -uadrado extends @b$Aeometrico
{
public -uadrado(double xc) double 3c) double t1) double t.)
{
super(xc)3c); ## llama a constructor de la clase base
x1 = t1;
31 = t.;
}
public double area()
{
double a) b;
a = px E x1;
b = p3 E 31;
return . B (a B a 0 b B b);
}
private double x1) 31;
}
La siguiente a!licacin utili'a las clases -uadrado * -irculo:
import $ava.io.B;
import fi(uras.B;
public class 8rueba9i(uras
{
public static void main(2trin(! ar)t:ro"s I@Exception
{
-irculo cr = ne" -irculo(..&) ..?) ..&);
-uadrado cd = ne" -uadrado(C.&) C.?) *.C,) C.F?);
23stem.out.print('-entro del circulo > ');
cr.imprimir-entro();
23stem.out.println('-entro del cuadrado > ');
cd.imprimir-entro();
23stem.out.println('1rea del circulo > ' 0 cr.area());
23stem.out.println('1rea del cuadrado > ' 0 cd.area());
}
}
EJEMLO 4.4
Se declaran dos clases base, una clase derivada de una clase base y una clase derivada
de una clase base #ue a su ve% es derivada.
class 61
{
public 61() { 23stem.out.println('-onstructorE61'); }
}
class 6.
{
public 6.() { 23stem.out.println('-onstructorE6.');}
}
class D extends 61
{
public D() { 23stem.out.println('-onstructorED'); }
}
class G extends 6.
{
public G() { 23stem.out.println('-onstructorEG'); }
}
class D: extends G
{
public D:() { 23stem.out.println('-onstructorED:'); }
}
class -onstructor
{
public static void main(2trin( ! ar)
{
D d1 = ne" D();
23stem.out.println('HHHHHHHHHHHHHHHIn');
D: d. = ne" D:();
}
}
EJEMLO 4.#
La clase )ec*a define el mtodo escribir(), la clase )ec*a+uliana *ereda de la clase
)ec*a y sobreescribe el mtodo.
class 9ec:a
{
private int d) m) a;
public 9ec:a(int dia) int mes) int an3o)
{
d = dia;
m = mes ;
a = an3o;
}
public 9ec:a(){}
public void escribir()
{
23stem.out.println('In' 0 d 0' # ' 0 m 0 ' # ' 0 a);
}
}
class 9ec:aJuliana extends 9ec:a
{
private int numDias;
public 9ec:aJuliana(int dia) int mes) int an3o){...}
public void escribir()
{
super.escribir(); ## llamada al m5todo de la clase 9ec:a
23stem.out.println('Dias transcurridos> ' 0 <umDias);
}
}
EJERCICIO 4.!
Se declaran las clases corres"ondientes a la erar#ua ,arco, -e.a"or y .elero/ con un
mtodo com0n, alarma(), #ue es redefinido en cada clase derivada.En el "rograma se
define un array de referencias a ,arco, se crean obetos de las clases derivadas
-eva"or y .elero, asigna esos obetos al array y "or 0ltimo se llama al mtodo
redefinido.
class 6arco
{
public 6arco()
{
23stem.out.print('It2e crea parte de un barco. ');
}
public void alarma()
{
23stem.out.println('It2.@.2 desde un 6arco');
}
}
class DeKapor extends 6arco
{
public DeKapor()
{
23stem.out.println('2e crea la parte del barco de vapor. ');
}
public void alarma()
{
23stem.out.println('It2.@.2 desde un 6arco de Kapor');
}
}
class Kelero extends 6arco
{
public Kelero()
{
23stem.out.println('2e crea la parte del barco velero. ');
}
public void alarma()
{
23stem.out.println('It2.@.2 desde un Kelero');
}
}
public class 1larmasDe6arcos
{
public static void main(2trin( ! ar)
{
6arco! bs = ne" 6arco.!;
DeKapor mss = ne" DeKapor();
Kelero vss = ne" Kelero();
bs&! = mss; bs1! = vss;
for (int i = &; i/.; ) bsi00!.alarma();
}
}
EJERCICIO 4.4
&onsiderese una erar#ua de barcos, todos tienen como com"ortamiento com0n
msgeSocorro() y alarma(). Las clases ,arco1asae, 1ortaAvion y 1es#uero
im"lementan el com"ortamiento com0n.
#e declara el interfa' ,arco:
interface 6arco
{
void alarma();
void ms(e2ocorro(2trin( av);
}
Las clases ,arco1asae, 1ortaAvion * 3esquero im!lementa el interfa' ,arco *
adem"s sus mtodos:
class 6arco8asa$e implements 6arco
{
private int eslora;
private int numero-amas = 1&1;
public 6arco8asa$e()
{
23stem.out.println('2e crea ob$eto 6arco8asa$e.');
}
public void alarma()
{
23stem.out.println('LLL 1larma del barco pasa$ero MMM');
}
public void ms(e2ocorro(2trin( av)
{
alarma();
23stem.out.println('LLL 2@2 2@2 MMM' 0 av);
}
}
class 8orta1vion implements 6arco
{
private int aviones = 1D;
private int tripulacion;
public 8orta1vion(int marinos)
{
tripulacion = marinos;
23stem.out.println('2e crea ob$eto 8orta1viones.');
}
public void alarma()
{
23stem.out.println('LLL marineros a sus puestos MMM');
}
public void ms(e2ocorro(2trin( av)
{
23stem.out.println('LLL 2@2 2@2 MMM ' 0 av);
}
}
class 8esNuero implements 6arco
{
private int eslora;
private double potencia;
private int pescadores;
2trin( nombre;
public 8esNuero(int tripulacion)
{
pescadores = tripulacion;
23stem.out.println('2e crea ob$eto 6arco 8esNuero.');
}
public void alarma()
{
23stem.out.println('LLL 1larma desde el pesNuero ' 0
nombre 0 ' MMM');
}
public void ms(e2ocorro(2trin( av)
{
23stem.out.println('LLL 2@2 2@2 MMM) ' 0 av);
}
}