Apuntes Unidad4 Polimorfismo POO
Apuntes Unidad4 Polimorfismo POO
Apuntes Unidad4 Polimorfismo POO
Victoria
Educacin a Distancia
Contenido
4.1 4.2 4.3 4.4 4.5 Concepto de Polimorfismo Clases Abstractas: definicin, implementacin Interfaces: definicin, implementacin Variables Polimrficas (clases genricas, plantillas) Reutilizacin de cdigo Pag. 3 4 7 11 16
Educacin a Distancia
4.1. Concepto de Polimorfismo El polimorfismo y la herencia, forman dos de los principales pilares de la POO. La palabra polimorfismo tiene su origen en las palabras griegas poli (muchos) y morfos (formas) y se utiliza para indicar que un mismo mensaje enviado a diferentes objetos producir muchas formas de respuesta. En general, podemos hablar de dos tipos de polimorfismo: Paramtrico. (o de plantillas) De Inclusin. (o de redefinicion) El polimorfismo paramtrico es la capacidad para definir varios mtodos utilizando el mismo nombre, pero usando parmetros diferentes (nombre y/o tipo). Este polimorfismo selecciona automticamente el mtodo a ejecutar en funcin del tipo de datos pasados en el parmetro (sobrecarga de mtodos). El polimorfismo de inclusin es la habilidad para redefinir un mtodo, en las subclases, que es heredado de una superclase se llama especializacin. Por lo tanto, se puede llamar un mtodo con un objeto sin tener que conocer su tipo intrnseco. Permite no tomar en cuenta detalles de las clases especializadas de una familia de objetos, enmascarndolos con una interfaz comn (siendo esta la superclase). El polimorfismo nos permite programar en forma general, en vez de programar en forma especfica. En especial, el polimorfismo nos permite escribir programas que procesan objetos de clases que forman parte de la misma jerarqua de clases, como si todos fueran objetos de sus superclases. El polimorfismo funciona mediante las referencias a la superclase. El polimorfismo puede considerarse como la caracterstica ms potente de los lenguajes orientados a objetos, despus de su capacidad para soportar la abstraccin.
Educacin a Distancia
4.2. Clases Abstractas: definicin, implementacin Hay ocasiones en las que se necesitar definir una superclase que declare la estructura de una abstraccin dada sin proveer una implementacin completa de cada mtodo. Es decir una superclase que defina una forma general que ser compartida por las subclases, dejando que cada subclase complete los detalles. Esta situacin se presenta cuando una superclase es incapaz de crear una implementacin completa para un mtodo. Para estos casos se debe tener una forma de asegurar que la subclase sobrescriba los mtodos necesarios. La solucin a este problema son los mtodos abstractos. Para especificar qu mtodos van a ser sobrescritos por la subclase se utiliza la palabra reservada abstract. Estos mtodos son implementados en la superclase y, es la subclase la que debe sobrescribirlos. Para declarar un mtodo abstracto se utiliza el siguiente formato: abstract tipo_de_devolucin nombre_mtodo ( lista_de_parmetros ) ( el cuerpo del mtodo no es necesario ) Cualquier clase que contiene uno o ms mtodos abstractos debe ser declarada como abstracta. Para declarar una clase abstracta se antepone la palabra reservada abstract antes de la palabra reservada class. No puede haber objetos de una clase abstracta. Una clase abstracta no puede ser instanciada con el operador new. La razn de ello es que no se pueden usar objetos de una clase que no est completamente definida. No se pueden declarar constructores abstractos o mtodos estticos abstractos. Cualquier subclase de una clase abstracta debe implementar todos los mtodos declarados como abstractos en la superclase. Una forma de obligar a que una superclase sea utilizada, es escribiendo una nueva clase que herede de ella. Para ello en la superclase se utiliza el modificador abstract antes de la definicin de la clase: abstract class NombreDeClase { .. } Una clase declarada abstract no se puede instanciar, aunque pueden existir referencias con objetos de clases derivadas de la siguiente forma: NombreDeClase objeto = new NuevaClase();
Si en la cabecera de algn mtodo de una clase se utiliza la palabra reservada abstract, este ser abstracto y la clase donde se encuentre tambin lo ser. Con esto se consigue tener realizaciones parciales de tipos de objetos cuya codificacin no existe, Una clase abstracta es, por lo tanto, una clase especificada pero no totalmente implementada. Lo que est obligando a que todas las clases derivadas ofrezcan una parte comn en su interfaz. Las clases abstractas representan conceptos generales, es decir las caractersticas comunes de una serie de objetos. Ejemplo: Creamos una clase abstracta denominada Animal de la cual deriva las clases Gato y Perro. Ambas clases redefinen la funcin habla declarada abstracta en la clase base Animal. public abstract class Animal { public abstract void habla(); } class Perro extends Animal{ public void habla() { System.out.println("Guau!"); } } class Gato extends Animal{ public void habla() { System.out.println("Miau!"); } } El polimorfismo nos permite pasar la referencia a un objeto de la clase Gato a una funcin hazleHablar que conoce al objeto por su clase base Animal
public class PoliApp { public static void main(String[] args) { Gato gato=new Gato(); hazleHablar(gato); Perro perro=new Perro(); hazleHablar(perro); }
Educacin a Distancia
static void hazleHablar(Animal anim) { anim.habla(); } } El compilador no sabe exactamente que objeto se le pasar a la funcin hazleHablar en el momento de la ejecucin del programa. Si se pasa un objeto de la clase Gato se imprimir Miau!, si se pasa un objeto de la clase Perro se imprimir Guau! El compilador solamente sabe que se le pasar un objeto de alguna clase derivada de Animal. Por tanto, el compilador no sabe que funcin habla ser llamada en el momento de la ejecucin del programa. La referencia a una variable de la superclase puede utilizarse para referenciar a un objeto de la subclase. Java utiliza esta caracterstica para invocar los mtodos sobrescritos en tiempo de ejecucin. Cuando un mtodo sobrescrito es invocado por medio de una referencia a la superclase, Java determina cul mtodo debe ejecutarse dependiendo del tipo de objeto con que es referenciado en el momento que la llamada ocurre. Esta decisin es tomada en tiempo de ejecucin. Es el tipo de objeto, con que se referenca, el que determina cul versin de un mtodo sobrescrito ser ejecutado. En Java es posible asignar a una variable de una clase una referencia de cualquier objeto de la misma clase o de cualquier clase derivada de ella.
Educacin a Distancia
4.3. Interfaces: definicin, implementacin Una interfaz es una clase abstracta que define todos sus mtodos abstractos. En una interface se definen mtodos abstractos que pueden ser implementados por una o ms clases. Una interface no define ninguna implementacin de mtodos. Una interfaz es una declaracin de mtodos no estticos y campos estticos finales (constantes) cuyo fin es definir la estructura y comportamiento de las clases que la implementen. Los elementos de una interfaz son pblicos por definicin: no es necesario poner la palabra reservada public, ni se pueden cambiar sus derechos de acceso. Los atributos siempre son finales, sin necesidad del calificativo final, y hay que darles un valor inicial. Como consecuencia, no se permite el uso explcito del modificador de acceso public, como en el siguiente ejemplo: interface elemento { public int nmeroDeLnea ( ); // Error al compilar por el uso de public } Una clase puede implementar cualquier nmero de interfaces. Por el contrario, una clase solo puede heredar de una superclase. Una interfaz se define utilizando la palabra reservada interface. Una interfaz indica lo que se debe hacer pero no cmo se debe hacer. Cuando una clase implementa una interfaz, debe crear todos los mtodos definidos por la interfaz. Sin embargo cada clase tienen la libertad de determinar los detalles de implementacin de sus mtodos.
Educacin a Distancia
Implementacin de la definicin de una Interfaz Las interfaces estn en una jerarqua diferente que las clases, por esa razn es posible que clases no relacionadas jerrquicamente puedan implementar la misma interfaz. Una vez que se define una interfaz, puede ser utilizada por una o ms clases que la implementen. Para implementar una interfaz es necesario incluir la palabra reservada implements en la definicin de la clase as como crear todos los mtodos definidos por la interfaz. El formato es: class NombreClase implements NombreInterfaz { .. } Una clase puede implementar varias intefaces de la siguiente forma: class NombreClase NombreInterfazC, { .. } implements NombreInterfazA, NombreInterfazB,
En resumen la interfaz describe el qu, mientras que las clases que implementan la interfaz describen el cmo.
Tarea: 1. Escriba una aplicacin, llamada Biblioteca, para maneje libros y revistas (para los nombres de las clases use Libro y Revista) de una biblioteca. a) Las caractersticas comunes que se manejan tanto para las revistas como para los libros son el cdigo, el ttulo y el ao de publicacin. Estas tres caractersticas pasan por parmetro en el momento de crear los objetos. Escriba una clase llamada Publicacin que contenga las caractersticas comunes para Libro y Revista. b) Los libros tienen adems un atributo de si estn o no prestados. Los libros cuando se crean no estn prestados. c) Las revistas tienen un nmero. En el momento de crear las revistas se pasa el nmero por parmetro. d) Tanto los libros como las revistas deben tener un mtodo toString() que devuelve el valor de todos los atributos en una cadena de caracteres. Tambin tienen un mtodo que devuelve el ao de la publicacin y otro para el cdigo.
Educacin a Distancia
e) Para prevenir posibles cambios en las clases se tiene que implementar una interfaz, llamada Prestable, con los mtodos prestar(), devolver(), y prestado(). La clase Libro debe implementar esta interfaz. La aplicacin Biblioteca deber tener los siguientes mtodos: a) cuentaPrestados() Recibe por parmetro un arreglo de objetos y devuelve cuntos de ellos estn prestados. b) publicacionesAnterioresA() Recibe por parmetro un arreglo de Publicaciones y un ao, devuelve cuntas publicaciones tienen fecha anterior al ao recibido por parmetro. c) En el mtodo main() se debe crear un arreglo de Publicaciones con 2 libros y 2 revistas. Se debe prestar uno de los libros y posteriormente mostrar en pantalla los datos almacenados en el arreglo. Adicionalmente se debe mostrar en pantalla cuntos libros hay prestados y cuntas publicaciones hay anteriores a 1980. 2.Escriba una clase llamada Empleado que tenga como atributos los siguientes: nombre de tipo String, apellido de tipo String y puesto de tipo Puesto. La clase deber contener los siguientes mtodos: a. Empleado() Constructor que inicializar los atributos nombre y apellido con valores recibidos por parmetro. b. promocionGerente() mtodo que asigna a la referencia puesto un objeto de tipo Gerente. c. promocionDirector () mtodo que asigna la referencia puesto un objeto de tipo Director. d. obtenerTituloPuesto() devolver un String que representara la descripcin del puesto para el caso de Directores y Gerentes. Cualquier otro empleado tendr por descripcin del puesto el ttulo de empleado. e. toString() Que devuelva los valores de todos los atributos de la clase Tanto a los Gerentes como a los Directores se les asignara una descripcin de su puesto y de su responsabilidad. Escriba una interface llamada Puesto que defina los siguientes mtodos: String obtenerDescripcionDelPuesto( ); String obtenerDescripcionDeResponsabilidad( ); Tanto la clase Gerente como la clase Director debern implementar la interface Puesto. Los mtodos ObtenerDescripcionDelPuesto( ) y obtenerDescripcionDeResponsabilidad( ) debern regresar una descripcin adecuada tanto para el titulo del puesto como la descripcin de la funcin que se realiza en los puestos de Gerente y de Director. Escriba un aplicacin que instancie un objeto de la clase Empleado, asigne valores a todos sus atributos al momento de crear los objetos y muestre su
Educacin a Distancia
informacin en pantalla. Los valores para los atributos del empleado son Jose ,Aguirre. Una vez creado promuvalo a Gerente, muestre de nuevo su informacin en pantalla. Despus de promovido a Gerente, promuvalo a Director y muestre de nuevo sus informacin en pantalla.
Educacin a Distancia
10
4.4. Variables Polimrficas (Clases Genricas, Plantillas) Las clases genricas son clases cuya definicin se puede parametrizar de acuerdo a un tipo genrico (son una abstraccin en la definicin de una clase). El tipo concreto se proporciona cuando se declaran elementos de dicha clase. Las interfaces tambin pueden ser parametrizadas. Un ejemplo de la definicin de una interface parametrizada es la interfaz Iterator del paquete java.util: public inteface Iterator <E> { boolean hasNext( ); E next(); void remove(); } Esta definicin de interfaz la hace diferente a la de cualquier otra definicin de interfaz por el parmetro <E> (parmetro cuyo tipo es E). Los genricos pueden ser heredados por cualqui9er otra clase o interfaz, las reglas de extensin son las mismas que aplican en la herencia.
Ejemplo: Escriba una clase generica, llamada MatrrizGenrica, que contenga los siguientes mtodos: a. MatrizGenerica() - Constructor que recibe por parmetro el numero de filas y columnas de la matriz. b. establecerElemento() Recibe por parmetro la fila, columna y el elemento a insertar en la matriz (inserta solamente un elemento en la matriz). c. obtenerElemento() Recibe por parmetro la fila y la columna y devuelve el elemento de la matriz que se encuentra en la posicin indicada. El elemento devuelto es del tipo genrico. d. columnas() Devuelve el numero de columnas de la matriz. e. filas() Devuelve el numero de filas de la matriz. f. toString() Devuelve en forma de String los valores de los elementos de la matriz. Escriba una aplicacin, llamada PruebaMatrizGenerica, que realice lo siguiente: a. Cree una matriz de Integer de 4 filas y 2 columnas b. Rellene la matriz con numeros consecutivos empezando con el numero 1. c. Muestre por pantalla la matriz.
Educacin a Distancia
11
d. e. f. g. h.
Muestre por pantalla el contenido de la matriz en la fila 0 columna 1. Cree una matriz de String de 2 filas y 2 columnas Rellene la matriz cadenas de caracteres a su eleccin. Muestre por pantalla la matriz. Muestre por pantalla el contenido de la matriz en la fila 1 columna 1.
public class MatrizGenerica <E> { private E[][] tabla; public Matriz( int filas, int columnas) { tabla = (E[][])new Object [filas] [columnas]; } public void establecerElemento(int fila, int columna, E elemento) { tabla[fila][columna] = elemento; } public E obtenerElemento(int fila, int columna) { return tabla[fila][columna]; } public int columnas() { return tabla[0].length; } public int filas() { return tabla.length; } public String toString() { String s=""; for (int i = 0; i < tabla.length; i++) { for (int j = 0; j < tabla[0].length; j++) { s+=tabla[i][j]+ "\t"; } s+= "\n"; }
Educacin a Distancia
12
return s; } } public class PruebaMatrizGenerica { public static void main(String[] args) { MatrizGenerica <Integer> m = new MatrizGenerica <Integer >(4,2); int num = 1; for (int i = 0; i < m.filas(); i++) { for (int j = 0; j < m.columnas(); j++) { m.establecerElemento(i, j, num++); } } System.out.println(m); System.out.println(" " + m.obtenerElemento(0, 1)); Matriz <String> mc = new Matriz <String >(2,2); mc.establecerElemento(0, 0, mc.establecerElemento(0, 1, mc.establecerElemento(1, 0, mc.establecerElemento(1, 1, "Lilia"); "Martha"); "Rosa"); "Marisa");
Tarea: Escriba una clase generica, llamada ArregloGenrico, que contenga los siguientes mtodos: a. ArregloGenrico () - Constructor que recibe por parmetro el numero de elementos del arreglo.
Educacin a Distancia
13
b. establecerElemento() Recibe por parmetro la posicin y el elemento a insertar en el arreglo (inserta solamente un elemento en el arreglo). c. obtenerElemento() Recibe por parmetro la posicin y devuelve el elemento del arreglo que se encuentra en la posicin indicada. El elemento devuelto es del tipo genrico. d. elementos() Devuelve el numero de elementos del arreglo. e. toString() Devuelve en forma de String los valores de los elementos del arreglo. Escriba una aplicacin, llamada PruebaArregloGenerico, que realice lo siguiente: a. Cree un arreglo de Integer de 10 elementos. b. Rellene el arreglo con numeros consecutivos empezando con el numero 1. c. Muestre por pantalla el arreglo. d. Muestre por pantalla el contenido del arreglo en la posicin 4. e. Cree un arreglo de String de 5 elementos f. Rellene el arreglo con cadenas de caracteres a su eleccin. g. Muestre por pantalla el arreglo. h. Muestre por pantalla el contenido del arreglo en la posicin 3.
Educacin a Distancia
14
Educacin a Distancia
15
4.5. Reutilizacin de cdigo (Definicin y Creacin de paquetes/libreras) Los paquetes son contenedores de clases que se utilizan para mantener el espacio de nombres de clase dividido en compartimientos. Un paquete permite que se cree una clase con cierto nombre dentro de l y que ese mismo nombre sea utilizado por otra clase en otro paquete diferente sin crear conflicto alguno. Los paquetes se almacenan de una manera jerrquica y se importan explcitamente en las definiciones de nuevas clases. Los paquetes y las interfaces son dos de los componentes bsicos de un programa Java. Java provee un mecanismo para particionar el espacio de nombres de clase en porciones ms manejables. Este mecanismo es el paquete. Los paquetes permiten dar nombres y restringir la visibilidad de las clases. Se pueden definir clases dentro de un paquete sin permitir que el mundo exterior del paquete sepa que estn ah. Tambin se pueden definir miembros que solo estn accesibles a otros miembros del mismo paquete. Definicin de un paquete La creacin de un paquete se realiza incluyendo el comando package como primera instruccin de un archivo fuente en Java. Cualquier clase que se defina dentro de ese archivo pertenece a ese paquete. Los paquetes definen un conjunto de espacios de nombres particionados en los que se almacenan las clases. Si se omite la instruccin package, las clases se asocian al paquete por defecto, que no tiene nombre. Aunque el paquete por defecto es apropiado para programas breves de ejemplo, no es adecuado para las aplicaciones reales, donde la mayor parte de las veces se suele definir un paquete. Sintaxis de la declaracin de un paquete: package paq; donde paq es el nombre del paquete. Java utiliza los directorios del sistema de archivos para almacenar los paquetes. Una instruccin package se puede incluir en ms de un archivo fuente, ya que dicha instruccin simplemente especifica a qu paquete pertenecen las clases definidas dentro de ese archivo, por lo que no se impide que otras clases de otros archivos puedan formar parte del mismo paquete. En las aplicaciones reales, los paquetes se suelen distribuir en muchos archivos fuente. Se puede crear una jerarqua de paquetes dentro de paquetes separando los niveles con puntos. Sintaxis de la declaracin de un paquete multinivel: package paq1[.paq2[.paq3]]; Esta jerarqua de paquetes se debe reflejar en el sistema de archivos del sistema de desarrollo de Java. Un paquete declarado como: package java.awt.imagen;
Educacin a Distancia
16
Modificadores de acceso en los paquetes Desde cualquier sitio se puede acceder a cualquier cosa declarada como public. Cualquier cosa declarada como private no se puede ver desde el exterior de una clase. Si un elemento no tiene ningn modificador, entonces ser visible en las subclases, adems de en otras clases del mismo paquete (esto es lo establecido por defecto). Si se desea mostrar algo fuera del paquete actual, pero solamente a clases que sean subclases directas de su clase, entonces estos elementos se declaran protected. Una clase tiene dos posibles niveles de acceso: por defecto y pblica. Cuando una clase se declara como public, es accesible por cualquier cdigo. Si una clase tiene acceso por defecto, entonces puede ser accedida solo por cdigo que se encuentre dentro del mismo paquete. Uso de paquetes (importacin) Todas las clases estndares en Java estn almacenadas en algn paquete con nombre. Como las clases que estn dentro de paquetes tienen que estar cualificadas con el nombre o nombres de la jerarqua de paquetes, se hara tedioso tener que introducir para cada clase que quisiramos utilizar el nombre de la estructura de paquetes (separados por puntos). Para poder ver ciertas clases o paquetes completos, Java incluye la instruccin import. Una vez importada, una clase puede ser referenciada directamente, utilizando solo su nombre. La instruccin import es til al programador, pero no es tcnicamente necesaria para escribir un programa Java completo. En un archivo fuente de Java, las instrucciones import tienen que ir inmediatamente despus de la instruccin package, si existe, y antes de las definiciones de las clases. Sintaxis: import paquete1.[.paquete2].(nombre_clase | * ); paquete1 es el nombre de un paquete de nivel superior, paquete2 es el nombre de un paquete subordinado contenido en el paquete exterior separado por un punto (.) . No hay ningn lmite prctico en la profundidad de la jerarqua de paquetes, solo el que imponga el sistema de archivos. Por ltimo, se especifica un nombre_clase explcito o un asterisco (*), que indica que le compilador de Java debera importar ese paquete completo. Ejemplos: import java.util.Date; import java.io.*; Todas las clases estndares de Java estn almacenadas en un paquete llamado java. Las funciones del lenguaje bsicas se almacenan dentro del paquete de java llamado java.lang. Normalmente se tiene que importar cada paquete o clase que se desea utilizar, pero debido a que Java no es til sin gran parte de la funcionalidad de java.lang, el compilador la importa
Educacin a Distancia
17
implcitamente para todos los programas. Es equivalente a tener al inicio de todos los programas la siguiente lnea: import java.lang.*; Siempre que se utiliza el nombre de una clase, se puede incluir su nombre completamente cualificado, que incluye su jerarqua de paquetes completa. Ejemplo de cdigo que utiliza la instruccin import. import java.util.*; class MiFecha extends Date { .... } el mismo ejemplo sin la instruccin import queda de la siguiente forma: class MiFecha extends java.util.Date { .... }
Educacin a Distancia
18