Universidad Privada San Pedro Taller De Programacin I
Ing. Carlos Alberto Zelada Chvez 1
HERENCIA TEMA 2
CAPACIDADES Conocer la propiedad de la orientacin a objetos: Herencia. Especificar jerarqua de clases. Determinar las diferencias entre Herencia Simple y Herencia Mltiple Desarrollar aplicaciones en Java de problemas con orientacin a objetos: Uso de Herencia.
Herencia. Definicin La Herencia es la relacin que existe entre dos clases, en la que una clase derivada se crea a partir de otra ya existente, denominada clase base Es un Mecanismo exclusivo y fundamental de la Programacin Orientada a Objetos. Es el principal mecanismo que ayuda a fomentar y facilitar la reutilizacin del software
Universidad Privada San Pedro Taller De Programacin I
Ing. Carlos Alberto Zelada Chvez 2
Herencia. Definicin La relacin de herencia se establece entre una nueva clase (referida aqu con el nombre Nueva) y una clase ya existente (referida aqu con el nombre Existente). Exi st en t e N ue va
Herencia. Definicin La relacin de herencia se establece entre una clase Nueva y una clase Existente. Sobre la clase que hereda de la existente: Nueva hereda todas las caractersticas de Existente. Nueva puede definir caractersticas adicionales. Nueva puede redefinir caractersticas heredadas de Existente. El proceso de herencia no afecta de ninguna forma a la superclase Existente. Para que una nueva clase sea subclase de otra existente basta con aadir extends existente a continuacin del nombre de la nueva:
Herencia. Definicin public class Nueva extends Existente { ..... }
Universidad Privada San Pedro Taller De Programacin I
Ing. Carlos Alberto Zelada Chvez 3 Tipos de Herencia. HERENCIA SIMPLE es un tipo de herencia en la que una clase hereda el estado (estructura) y el comportamiento de una sola clase base. Es decir hay herencia simple cuando una clase hereda de una sola clase base. Publicacion Revista Libro
Tipos de Herencia. HERENCIA MULTIPLE Es un tipo de herencia en la que una clase hereda el estado (estructura) y el comportamiento de ms de una clase base. Java no ha desarrollado la herencia mltiple, slo permite la herencia de una sola clase base. En casos especiales es posible simular herencia mltiple con las interfaces.
Ejemplo Herencia Mltiple P e rs o n a Es tu d i a n te P r o fe s o r E s tu d i a n te D o cto ra d o P ro fe s o r Ayu d a n te
Universidad Privada San Pedro Taller De Programacin I
Ing. Carlos Alberto Zelada Chvez 4 Herencia. Implementacin Java Public class Empleado{ protected String codigo; protected String apell, nomb, cargo; protected double sueldo; public Empleado(String ncod, String nape, String nnom, String ncar, double nsuel) { codigo=ncod; apell=nape; nomb=nnom; cargo=ncar; sueldo=nsuel; }
Herencia. Implementacin Java. public void aumentasueldo(double porcentaje) { sueldo+=sueldo*porcentaje*100; } public String toString() { return apell+nomb; } }
Categora protected: El especificador de acceso protected es equivalente al especificador private con el agregado de que los atributos protegidos de una clase base son accesibles para los miembros de cualquier clase derivada de esa clase.
Control de acceso a los miembros de las clases
Un miembro declarado en una clase como
Puede ser accesado desde: privado predeterminado protegido pblico
Su misma clase.................................
si
si
si
si Cualquier clase o subclase del mismo paquete ............................................
no
si
si
si
Cualquier otra clase de otro paquete
no
no
no
si
Cualquier subclase de otro paquete
no
no
si
si
Universidad Privada San Pedro Taller De Programacin I
Ing. Carlos Alberto Zelada Chvez 6
Herencia y Constructores Los constructores de la clase base se invocan antes del constructor de la clase derivada. Si una clase base, es a su vez una clase derivada, sin constructores se invocan tambin en secuencia: constructor base, constructor derivada. Los constructores no se heredan aunque los constructores por defecto se generan si se requiere.
Jerarqua de Clases
La clase Object Object es la raiz de la jerarqua de herencia (de implementacin) en Java Object define un conjunto de mtodos tiles, que pueden ser redefinidos en cada clase
Universidad Privada San Pedro Taller De Programacin I
Ing. Carlos Alberto Zelada Chvez 7
Mtodos de la clase clase Object public boolean equals(Object o): Permite definir el criterio de igualdad utilizado para los objetos de una determinada clase (el operador == nicamente chequea la igualdad de referencias). public String toString(): Permite decidir la representacin externa de un objeto. Por defecto es el valor de su referencia, etiquetada con el nombre de la clase. protected Object clone() throws CloneNotSupportedException : devuelve una copia del objeto si la clase implementa la interfaz Cloneable.
Mtodos de la clase clase Object public final Class getClass(): clase que representa el tipo del objeto. protected void finalize() throws Thorowable: (relacionado con liberar memoria)
Ejemplo. Mtodos clase Object class Punto implements Cloneable { private int x,y; public Punto(int a, int b) { x=a; y=b; } public Punto() { x=0; y=0; }
Universidad Privada San Pedro Taller De Programacin I
Ing. Carlos Alberto Zelada Chvez 8 Ejemplo. Mtodos clase Object public Object clone() { Object obj=null; try { obj=super.clone(); } catch(CloneNotSupportedException ex) { System.out.println("no se puede duplicar.."); } return obj; } public void trasladar (int dx, int dy) { x=x+dx; y=y+dy; }
Ejemplo. Mtodos clase Object p1=null; p2=null; // Ejecutar el recolector de basura Runtime runtime = Runtime.getRuntime(); runtime.gc(); runtime.runFinalization(); } }
Universidad Privada San Pedro Taller De Programacin I
Ing. Carlos Alberto Zelada Chvez 10
Java - Herencia APLICACIN DESARROLLADA
Enunciado aplicacin Herencia Elabore una aplicacin java que implemente herencia de figuras geomtricas (cuadrado, tringulo y crculo). Implementar mtodos y botones para calcular el rea y dibujar el objeto correspondiente.
Pasos 1. Disee la interfaz visual.
Universidad Privada San Pedro Taller De Programacin I
Ing. Carlos Alberto Zelada Chvez 11
Pasos
Pasos
2. Escribir atributos y mtodos de la clase Figura public class Figura { protected String nombre; protected double area; public Figura(String xno) { nombre=xno; } public String getnonbre() { return "Soy un "+nombre; } public double getarea() { return area; } }
Universidad Privada San Pedro Taller De Programacin I
Ing. Carlos Alberto Zelada Chvez 12
3. Escribir atributos y mtodos de la clase Poligono public class Poligono extends Figura { protected double largo,ancho; public Poligono(String xn, double a, double b) { super(xn); largo=a; ancho=b; } public double getlar() { return largo; } public double getan() { return ancho; } }
4. Escribir atributos y mtodos de la clase Circulo public class Circulo extends Figura { private double radio; public Circulo(double ra) { super("circulo"); radio=ra; } public void areacir() { area=3.1415*radio*radio; } public void dibujacir(Graphics g) { int xl, xa; int tx=(int)radio; int ty=(int)radio; g.drawOval(300,200,tx,tx); } }
5. Escribir atributos y mtodos de la clase Cuadrado public class Cuadrado extends Poligono { public Cuadrado(double m) { super("cuadrado",m,m); } public void areacuad() { area=largo*ancho; } public void dibujacuad(Graphics g) { int xl, xa; xl=(int)largo; g.drawLine(300,200,300+xl,200); g.drawLine(300+xl,200,300+xl,200+xl); g.drawLine(300+xl,200+xl,300,200+xl); g.drawLine(300,200+xl,300,200); } }
Universidad Privada San Pedro Taller De Programacin I
Ing. Carlos Alberto Zelada Chvez 13
6. Escribir atributos y mtodos de la clase Triangulo public class Triangulo extends Poligono { public Triangulo(double p, double q) { super("triangulo",p,q); } public void areatrian() { area=0.5*largo*ancho; } public void dibujatrian(Graphics g) { int xl, xa; xl=(int)largo; xa=(int)ancho; g.drawLine(300,200,300+xl,200); g.drawLine(300+xl,200,300+xl,200+xl); g.drawLine(300+xl,200+xl,300,200); } }
7. Definicin de Objetos En la clase Frame1 definir los siguientes objetos: Cuadrado c1; Triangulo t1; Circulo cir;
Universidad Privada San Pedro Taller De Programacin I
Ing. Carlos Alberto Zelada Chvez 15
Ejecucin
Ejecucin
HERENCIA-COMPOSICION TEMA 3
Universidad Privada San Pedro Taller De Programacin I
Ing. Carlos Alberto Zelada Chvez 16
Relaciones entre clases Un conjunto de objetos aislados tiene escasa capacidad para resolver un problema. En una aplicacin til los objetos colaboran e intercambian informacin, mantienen distintos tipos de relaciones entre ellos A nivel de diseo, podemos distinguir entre 5 tiposde relaciones bsicas entre clases de objetos: dependencia, asociacin, agregacin, composicin y herencia*
Dependencia La dependencia es la relacin menos importante. Simplemente refleja que entre dos clases de objetos existe una posible colaboracin temporal con algn propsito Una dependencia puede indicar la utilizacin de un objeto de una clase como argumento de una operacin de otra o en su implementacin Como vimos anteriormente, la clase Cuenta requiere las clases FileOutputStream y ObjectOutputStream de la librera de clases de Java para la implementacin de la operacin salvar
Asociacin En cambio, la asociacin es la relacin ms importante y ms comn. Refleja una relacin entre dos clases independientes que se mantiene durante la vida de los objetos de dichas clases o al menos durante un tiempo prolongado En UML suele indicarse el nombre de la relacin, el sentido de dicha relacin y las cardinalidades en los dos extremos Vamos a sustituir el atributo titular por una asociacin con una nueva clase Cliente completa
Universidad Privada San Pedro Taller De Programacin I
Ing. Carlos Alberto Zelada Chvez 17
Asociacin Una asociacin se implementa en Java introduciendo referencias a objetos de la clase destino de la relacin como atributos de la clase origen Si la relacin tiene una cardinalidad superior a uno entonces ser necesario utilizar un array o una estructura de datos dinmica del paquete java.util como Vector o LinkedList Normalmente la conexin entre los objetos se realiza recibiendo la referencia de uno de ellos en el constructor u otra operacin similar del otro
Ejemplo de Asociacin public class Cuenta { long numero; Cliente titular; private float saldo; float interesAnual; // Constructor general public Cuenta (long aNumero, Cliente aTitular, float aInteresAnual) { numero = aNumero; titular = aTitular; saldo = 0; interesAnual = aInteresAnual; } Cliente leerTitular () { return titular; } // Resto de operaciones de la clase Cuenta a partir de aqu
Universidad Privada San Pedro Taller De Programacin I
Ing. Carlos Alberto Zelada Chvez 18
Agregacin La agregacin es un tipo especial de asociacin donde se aade el matiz semntico de que la clase de donde parte la relacin representa el todo y las clases relacionadas las partes. Realmente Java y la mayora de lenguajes orientados a objetos no disponen de una implementacin especial para este tipo de relaciones. Bsicamente se tratan como las asociaciones ordinarias
Composicin La composicin es un tipo de agregacin que aade el matiz de que la clase todo controla la existencia de las clases parte. Es decir, normalmente la clase todo crear al principio las clases parte y al final se encargar de su destruccin Supongamos que aadimos un registro de movimientos a la clase Cuenta, de forma que quede constancia tras cada ingreso o reintegro
Composicin Las composiciones tienen una implementacin similar a las asociaciones, con la diferencia de que el objeto principal realizar en algn momento la construccin de los objetos compuestos import java.util.Date class Movimiento { Date fecha; char tipo; float importe; float saldo; public Movimiento (Date aFecha, char aTipo, float aImporte, float aSaldo) { fecha = aFecha; tipo = aTipo; importe = aImporte; saldo = aSaldo; } }
Universidad Privada San Pedro Taller De Programacin I
Ing. Carlos Alberto Zelada Chvez 19
Composicin public class Cuenta { long numero; Cliente titular; private float saldo; float interesAnual; LinkedList movimientos; // Lista de movimientos // Constructor general public Cuenta (long aNumero, Cliente aTitular, float aInteresAnual) { numero = aNumero; titular = aTitular; saldo = 0; interesAnual = aInteresAnual; movimientos = new LinkedList (); } .
Composicin // Continua clase Cuenta // Nueva implementacin de ingreso y reintegro public void ingreso (float cantidad) { movimientos.add (new Movimiento (new Date (), 'I', cantidad, saldo += cantidad)); } public void reintegro (float cantidad) { movimientos.add (new Movimiento (new Date (), 'R', cantidad, saldo -= cantidad)); } public void ingresoInteresMes () { ingreso (interesAnual * saldo / 1200); } // Resto de operaciones de la clase Cuenta a partir de aqu .. }
CLASES ABSTRACTAS HERENCIA MULTIPLE INTERFACES TEMA 4
Universidad Privada San Pedro Taller De Programacin I
Ing. Carlos Alberto Zelada Chvez 20
Clases Abstractas Clases abstractas: Clases de las que no tiene sentido crear Objetos, pero que agrupan caractersticas de clases que derivan de ellas. Ejemplo: Clase LavadoraMX, no tiene sentido que existan objetos (lavadoras) de esta clase: existen lavadoras MX1, MX2 y MX3deLuxe. La finalidad de LavadoraMX es definir los aspectos comunes a todos los modelos de lavadoras que se fabrican. Ejemplo: Por la carretera no circulan Vehculos en abstracto, circulan Coches, Camiones, Bicicletas, etc...
Clases Abstractas (Java) En Java se puede indicar explcitamente que una clase es abstracta y no se pueden crear objetos de ella: abstract class LavadoraMX { //... } abstract class Vehiculo { //... }
Mtodos Abstractos Las clases abstractas pueden (y suelen) incluir mtodos sin implementacin, son los llamados mtodos abstractos. Mtodos abstractos: Mtodos que no tienen implementacin y que obligan a ser implementados en las clases derivadas. Si una clase posee un mtodo abstracto es clase abstracta: Si una clase deriva de una clase abstracta y no implementa alguno de los mtodos abstractos de la clase base, entonces hereda el mtodo abstracto y se convierte en abstracta: Para poder crear objetos hay que implementar todos los mtodos abstractos heredados.
Universidad Privada San Pedro Taller De Programacin I
Clase Figura abstract class Figura { private String _nombre; abstract public double area (); abstract public void dibujar (); public Figura (String nombreFigura) { _nombre = nombreFigura; } public boolean menorQue (Figura f) { return ( this.area() < f.area() ); } public String toString () { return ( _nombre + " , " + area() ); } } No es posible crear Objetos de esta clase No es posible crear Objetos de esta clase Mtodo sin implementacin Mtodo sin implementacin Figura _nombre <<abstract>> area() <<abstract>> dibujar() menorQue() toString()
Clase Circulo class Circulo extends Figura { private double _radio; private static final double PI = 3.1415926535879; public Circulo (double r) { super ("Circulo"); _radio = r; } public Circulo () { this (10.0); } public double area () { return ( PI * _radio * _radio ); } public void dibujar () { System.out.println ("Soy un Circulo de radio: " + _radio); } } Los mtodos abstractos han sido implementados: Es posible crear objetos Circulo Los mtodos abstractos han sido implementados: Es posible crear objetos Circulo Construye la parte heredada de Figura, NO un objeto especfico Construye la parte heredada de Figura, NO un objeto especfico Circulo _radio area() dibujar()
Universidad Privada San Pedro Taller De Programacin I
Ing. Carlos Alberto Zelada Chvez 22
Clase Rectngulo class Rectangulo extends Figura { private double _base; private double _altura; public Rectangulo (double ancho, double alto) { super ("Rectangulo"); _base = ancho; _altura = alto; } public Rectangulo () { this (10.0, 10.0); } public double area () { return ( _base * _altura ); } public void dibujar () { System.out.println ("Soy un Rectangulo de: " + _base + "*" + _altura); } } Los mtodos abstractos han sido implementados: Es posible crear objetos Rectangulo Los mtodos abstractos han sido implementados: Es posible crear objetos Rectangulo Construye la parte heredada de Figura, NO un objeto especfico Construye la parte heredada de Figura, NO un objeto especfico Rectangulo _base _altura area() dibujar()
Clase Cuadrado class Cuadrado extends Rectangulo { public Cuadrado (double lado) { super (lado, lado); } public Cuadrado () { super (10.0, 10.0); } } Deriva de Rectangulo que no tiene mtodos abstractos: Es posible crear objetos Cuadrado Deriva de Rectangulo que no tiene mtodos abstractos: Es posible crear objetos Cuadrado Cuadrado
Ejemplo de utilizacin de la jerarqua de Figuras class testfiguras { public static void main (String[] args) { Figura[] fig = new Figura[3]; int menor; fig[0] = new Circulo(); fig[1] = new Cuadrado(55); fig[2] = new Rectangulo(20,30); for (int i=0; i<fig.length; i++) { System.out.println (fig[i]); System.out.println ("Area: " + fig[i].area()); System.out.println ("Dibujar:"); fig[i].dibujar(); } if ( fig[0].menorQue (fig[1]) ) menor = 0; else menor = 1; if ( fig[2].menorQue (fig[menor]) ) menor = 2; System.out.println ("La figura menor es:"); System.out.println (fig[menor]); } } Array de 3 Figuras (no crea objetos) Array de 3 Figuras (no crea objetos) Se crean 3 Figuras concretas y se almacenan en el array Se crean 3 Figuras concretas y se almacenan en el array fig[i] aplica los mtodos de su clase : Circulo, Cuadrado, Rectangulo
Universidad Privada San Pedro Taller De Programacin I
Ing. Carlos Alberto Zelada Chvez 23
Mtodos finales En ocasiones interesa indicar que un determinado mtodo no se puede redefinir Mtodo final final public boolean menorQue (Figura f) { return ( this.area() < f.area() ); } Las clases derivadas NO pueden redefinir menorQue Ojo: redefinir implica mantener la signatura del mtodo. Los mtodos finales tienen ligadura esttica (compilacin).
Clases finales Se puede prohibir que una clase sea extendida declarndola como final. final class Cuadrado extends Rectangulo { public Cuadrado (double lado) { super (lado, lado); } public Cuadrado () { super (10.0, 10.0); } } No es posible definir una nueva clase que derive de Cuadrado
Concepto: Una clase puede derivarse de varias clases base. Un EstudianteQueTrabaja es un Estudiante y es un Empleado Herencia mltiple Persona Estudiante Empleado EstudianteQueTrabaja Herencia Simple Herencia Simple Herencia Mltiple Herencia Mltiple 2, 3, 4, ... 2, 3, 4, ...
Universidad Privada San Pedro Taller De Programacin I
Ing. Carlos Alberto Zelada Chvez 24
Herencia mltiple: Conflictos (1) Persona nombre Estudiante Empleado EstudianteQueTrabaja Hereda nombre Hereda nombre Hereda 2 nombres?
Herencia mltiple: Conflictos (2) Persona nombre toString() Estudiante toString() Empleado <<final>> toString() EstudianteQueTrabaja Redefine toString() para incluir informacin sobre los estudios toString() identico al de Persona pero declarado como final Hereda toString() cul? Estudiante? Empleado?
Herencia mltiple No siempre es problemtica, pero se procura evitar, en la medida de los posible. Hay lenguajes O.O. que directamente no la soportan: Java, Smalltalk. Otros lenguajes O.O. s que la admiten: C++.
Universidad Privada San Pedro Taller De Programacin I
Ing. Carlos Alberto Zelada Chvez 25
Ejemplo Herencia Mltiple
Interfaces Una interface en Java es una coleccin de definiciones de mtodos (sin implementacin) y de valores constantes Una interface es anlogo a una clase abstracta con todos sus mtodos abstractos y variables finales y estticas con valor inicial. Una clase A puede heredar de una sola clase (extends<<>>herencia simple) y puede heredar de varias interfaces (implements <<>>herencia mltiple). Ambigedades no permitidas en herencia de variables (en general Java no resuelve por s mismo las ambigedades en ningn caso) Todas las interfaces descienden de Object No se permiten ciclos en el grafo de clases e interfaces
Interfaces en Java Cmo definir una interfaz? [public] interface nombre_interfaz extends superinterfaces { cuerpo interfaz } - Si el modificador de acceso public no est presente, la interfaz es slo accesible en el paquete al cual pertenece - El cuerpo de la interfaz puede incluir declaracin de constantes y de mtodos (sin definicin).
Universidad Privada San Pedro Taller De Programacin I
Ing. Carlos Alberto Zelada Chvez 26
Interfaces de JAVA - Una interfaz puede derivarse de varias interfaces. En este caso hereda todas las constantes y mtodos de sus superinterfaces, excepto aquellos que ella redefina. }
import java.util.*; // Interfaz IFecha: mtodos y constantes para obtener el da, //mes y ao public interface IFecha { public final static int DIA_DEL_MES = Calendar.DAY_OF_MONTH; public final static int MES_DEL_AO = Calendar.MONTH; public final static int AO = Calendar.YEAR; public abstract int da(); public abstract int mes(); public abstract int ao(); } Ejemplo Interface Java
public class CCuentaAhorro extends CCuenta implements IFecha { .... public void comisiones() { // Se aplican mensualm.por el mantenimiento de la cuenta if (da() == 1) reintegro(cuotaMantenimiento); } public double intereses() { if (da() != 1) return 0.0; // Acumular los intereses por mes slo los das 1 de cada mes double intProducidos = 0.0; intProducidos= estado() * obtenerTipoDeInters()/12; ingreso(intProducidos); // Devolver el inters mensual por si fuera necesario return interesesProducidos; }
Universidad Privada San Pedro Taller De Programacin I
Ing. Carlos Alberto Zelada Chvez 27
// Implementacin de los mtodos de la interfaz //IFecha public int dia() { GregorianCalendar fechaActual = new GregorianCalendar(); return fechaActual.get(DIA_DEL_MES); } public int mes() { return 0;} // no se necesita public int ao() { return 0;} // no se necesita } Ejemplo Interface Java
Cada clase que implemente una interfaz, debe definir todos los mtodos de sta ltima. Notar que el acceso a las constantes definidas en la interfaz es directo. Si una clase implementa una interfaz, todas sus subclases heredan los mtodos y constantes de aquella. Ejemplo Interface Java
Universidad Privada San Pedro Taller De Programacin I
Ing. Carlos Alberto Zelada Chvez 28
Clase abstracta vs interfaz Es equivalente una interfaz a una clase abstracta? Ejemplo: la interfaz IFecha se podra definir como una clase abstracta? No, pues CCuentaAhorro y CCuentaCorriente ya tienen una superclase. Mas an, la idea es que la interaccin con GregorianCalendar no requiere establecer una relacin de clases. Slo se utiliza la interfaz para implementar uno o dos mtodos especficos. Una interfaz es slo un protocolo que implementa una clase cuando necesita usarlo.
Para qu se usa una interfaz? 1 Para captar similitudes entre clases no relacionadas, sin forzar una relacin artificial. 2 Para declarar mtodos que una o mas clases deben implementar en determinadas situaciones. 3 Publicar la interfaz de programacin de una clase, sin descubrir como esta implementada.
POLIMORFISMO TEMA 5
Universidad Privada San Pedro Taller De Programacin I
Ing. Carlos Alberto Zelada Chvez 29
Concepto de Polimorfismo El Polimorfismo permite que diferentes objetos respondan de modo diferente al mismo mensaje. El Polimorfismo adquiere su mxima potencia cuando se utiliza en unin de la Herencia. El sentido del polimorfismo es realizar una generalizacin, olvidar los detalles concretos de uno o varios objetos de distintas clases y buscar un punto comn a todos ellos en un ancestro
Generalidades de Polimorfismo public class AppGestorTareas { public static void main (String[] args) { TPReloj tpr = new TPReloj (); TPAviso tpa = new TPAviso (Ha pasado un minuto, 60); TPEjecucion tpe = new TPEjecucion (/bin/sync, 120); TareaPeriodica tp; tp = tpr; tp.desactivar (); tp = tpa; tp.desactivar (); tp = tpe; tp.desactivar (); } }
Universidad Privada San Pedro Taller De Programacin I
Ing. Carlos Alberto Zelada Chvez 30
Generalidades de Polimorfismo La mayora de las veces, las conexiones polimorfas se realizan de manera implcita en el paso de argumentos a una operacin. De esta manera es posible escribir operaciones polimorfas que reciban objetos de mltiples clases.
Generalidades de Polimorfismo public class AppGestorTareas { private static void esperarEjecutar (TareaPeriodica tp) { while (!tp.necesitaEjecucion ()); tp.ejecutarTarea (); } public static void main (String[] args) { TPReloj tpr = new TPReloj (); TPAviso tpa = new TPAviso (Ha pasado un minuto, 60); TPEjecucion tpe = new TPEjecucion (/bin/sync, 120); esperarEjecutar (tpr); esperarEjecutar (tpa); esperarEjecutar (tpe); } }
Generalidades de Polimorfismo Otra aplicacin muy til es la construccin de estructuras de datos que puedan mantener objetos de distintas clases Vamos a implementar una nueva clase GestorTareas que va a contener una lista de tareas a realizar. La llamada a chequearEjecutar realizar la comprobacin y ejecucin de las tareas que lo requieran
Universidad Privada San Pedro Taller De Programacin I
Ing. Carlos Alberto Zelada Chvez 31
Generalidades de Polimorfismo Pero siempre debe quedar claro que tras la conexin polimorfa nicamente podemos acceder a las operaciones pertenecientes a la clase asociada a la referencia. El resto de operaciones del objeto no son accesibles a travs de esta referencia
Generalidades de Polimorfismo public class AppGestorTareas { public static void main (String[] args) { TPReloj tpr = new TPReloj (); TareaPeriodica tp; tp = tpr; tp.desactivar (); // Ok tp.leerHora () // Error !! tpr.leerHora (); // Ok } }
Generalidades de Polimorfismo En Java, una referencia a Object puede ser conectada a cualquier objeto, puesto que como sabemos es un ancestro de todas las clases public class AppGestorTareas { public static void main (String[] args) { TPReloj tpr = new TPReloj (); Object o; o = tpr; System.out.println (o.getClass ().getName ()); } }
Universidad Privada San Pedro Taller De Programacin I
Ing. Carlos Alberto Zelada Chvez 32
Generalidades de Polimorfismo Adems, las interfaces implementadas por una clase tambin pueden ser utilizadas para realizar conexiones polimorfas. Es decir, las interfaces que implementa una clase se comportan igual que las superclases en lo que respecta al uso del polimorfismo
Ligadura Esttica Entendemos por resolucin de una llamada el proceso por el cual se sustituye una llamada a una funcin por un salto a la direccin que contiene el cdigo de esta funcin Normalmente, la resolucin de llamadas se realiza en en tiempo de compilacin, porque resulta ms sencillo y sobre todo ms eficiente. Cuando la aplicacin se est ejecutando, las llamadas ya estn preparadas. Este enfoque se denomina ligadura esttica
Ligadura Dinmica El problema aparece en OOP cuando realizamos una conexin polimorfa y llamamos a una operacin redefinida
Universidad Privada San Pedro Taller De Programacin I
Ing. Carlos Alberto Zelada Chvez 33
Ligadura Dinmica El compilador no tiene informacin para resolver la llamada. Por defecto utilizara el tipo de la referencia, y por tanto generara una llamada a la implementacin de f () en la clase A Pero la referencia r puede apuntar a objetos de las clases A, B o C, con distintas versiones de f () La solucin consiste en esperar a resolver la llamada al tiempo de ejecucin, cuando se conoce realmente los objetos conectados a r, y cul es la versin de f () apropiada. Este enfoque de resolucin de llamadas se denomina ligadura dinmica y es mucho ms lenta y compleja que la esttica
Ligadura Dinmica Por tanto, la ligadura dinmica, por defecto en Java, garantiza siempre la llamada a la versin correcta de cada funcin, con independencia del uso de conexiones polimorfas o no Las llamadas a la funcin ejecutarTarea se resuelven correctamente, a pesar de realizarse a travs de una referencia a TareaPeriodica
Ligadura Dinmica .. public class AppGestorTareas { public static void main (String[] args) { TPReloj tpr = new TPReloj (); TPAviso tpa = new TPAviso (Ha pasado un minuto, 60); TPEjecucion tpe = new TPEjecucion (/bin/sync, 120); TareaPeriodica tp; tp = tpr; tp.ejecutarTarea (); // Versin de TPReloj tp = tpa; tp.ejecutarTarea (); // Versin de TPAviso tp = tpe; tp.ejecutarTarea (); // Versin de TPEjecucion } }
Universidad Privada San Pedro Taller De Programacin I
Ing. Carlos Alberto Zelada Chvez 34
Ligadura Dinmica frente a Ligadura Esttica Ligadura dinmica o postergada (tarda) se produce cuando un mtodo polimrfico se define para clases diferentes de una familia pero el cdigo real del mtodo no se conecta o enlaza hasta el tiempo de ejecucin. La ligadura dinmica se implementa normalmente en Java mediante mtodos abstractos que se deben de redefinir en las clases derivadas. Con ligadura dinmica, la seleccin del cdigo a ejecutar cuando se llama al mtodo se retrasa hasta el tiempo de ejecucin. Los mtodos abstractos son polimrficos y por consiguiente tienen diferentes implementaciones para clases diferentes de la familia
Ligadura Dinmica frente a Ligadura Esttica La Ligadura esttica se produce cuando se define un mtodo polimrfico para diferentes clases de una familia y el cdigo real del mtodo se conecta o enlaza en tiempo de compilacin. Los mtodos sobrecargados se enlazan estticamente. La ligadura esttica se produce cuando el cdigo del mtodo se enlaza en tiempo de compilacin. Esto significa que cuando se llama a un mtodo, el compilador determina en tiempo de compilacin cual es la versin del mtodo a llamar. Con los mtodos sobrecargados, el compilador puede determinar cual es el mtodo a llamar basado en el nmero y tipo de datos de los parmetros del mtodo
Ventajas del Polimorfismo El polimorfismo hace un sistema mas flexible, sin perder ninguna de las ventajas de la compilacin esttica de tipos que tienen lugar en tiempo de compilacin. Este es el caso de Java. Aunque existe menos libertad, el Polimorfismo en Java es una herramienta muy potente y que puede ser utilizada en muchas situaciones diferentes. Las aplicaciones ms frecuentes del polimorfismo son: _ Especializacin de clases derivadas _ Estructuras de datos heterogneas _ Gestin de una jerarqua de clases.