Sie sind auf Seite 1von 8

Unidad 4 Polimorfismo

4.1 Definicion de polimorfismo


El polimorfismo es un concepto de la programacin orientada a objetos que nos permite programar en forma general, en lugar de hacerlo en forma especfica. En general nos sirve para programar objetos con caractersticas comunes y que todos estos compartan la misma superclase en una jerarqua de clases, como si todas fueran objetos de la superclase. Esto nos simplifica la programacin. Recuerde el ejemplo del ecosistema, en donde todos los objetos de las distintas especies heredaban de una superclase llamada Animal, que brindaba la informacin general de cualquier animal, independiente de su especie. Sin embargo, cada especie hace un uso particular de cada uno de los mtodos u operaciones de la clase Animal. El mtodo comer() no se ejecutar de la misma manera en un Len() o en un Pavo(). Lo mismo ocurre para mtodos moverse() en objetos de tipo Tiburn() o Gallina(), aunque todas las especies realicen estos mtodos. A la sobrescritura o implementacin especfica de mtodos es la clave del polimorfismo. Para poner en prctica se har un ejemplo bastante sencillo. Se har una librera de clases que represente figuras tridimensionales y bidimensionales, y su respectiva jerarqua de clases. Las clases deben ser capaces de tener funcionamiento bastante bsico, como obtener reas, volmenes y permetros de la figura correspondiente.

4.2 Clases Abstractas

Concepto
Hay ocasiones, cuando se desarrolla una jerarqua de clases en que algn comportamiento est presente en todas ellas pero se materializa de forma distinta para cada una. Por ejemplo, pensemos en una estructura de clases para manipular figuras geomtricas. Podramos pensar en tener una clase genrica, que podra llamarse FiguraGeometrica y una serie de clases que extienden a la anterior que podran ser Circulo, Poligono, etc. Podra haber un mtodo dibujar dado que sobre todas las figuras puede llevarse a cabo esta accin, pero las operaciones concretas para llevarla a cabo dependen del tipo de figura en concreto (de su clase). Por otra parte la accin dibujar no tiene sentido para la clase genrica FiguraGeometrica, porque esta clase representa una abstraccin del conjunto de figuras posibles.

Para resolver esta problemtica Java proporciona las clases y mtodos abstractos. Un mtodo abstracto es un mtodo declarado en una clase para el cual esa clase no proporciona la implementacin (el cdigo). Una clase abstracta es una clase que tiene al menos un mtodo abstracto. Una clase que extiende a una clase abstracta debe implementar los mtodos abstractos (escribir el cdigo) o bien volverlos a declarar como abstractos, con lo que ella misma se convierte tambin en clase abstracta.

Declaracin e implementacin de mtodos abstractos


Siguiendo con el ejemplo del apartado anterior, se puede escribir: abstract class FiguraGeometrica { ... abstract void dibujar(); ... } class Circulo extends FiguraGeometrica { ... void dibujar() { // codigo para dibujar Circulo ... } } La clase abstracta se declara simplemente con el modificador abstract en su declaracin. Los mtodos abstractos se declaran tambin con el mismo modificador, declarando el mtodo pero sin implementarlo (sin el bloque de cdigo encerrado entre {}). La clase derivada se declara e implementa de forma normal, como cualquier otra. Sin embargo si no declara e implementa los mtodos abstractos de la clase base (en el ejemplo el mtodo dibujar) el compilador genera un error indicando que no se han implementado todos los mtodos abstractos y que, o bien, se implementan, o bien se declara la clase abstracta.

Referencias y objetos abstractos


Se pueden crear referencias a clases abstractas como cualquier otra. No hay ningn problema en poner: FiguraGeometrica figura; Sin embargo una clase abstracta no se puede instanciar, es decir, no se pueden crear objetos de una clase abstracta. El compilador producir un error si se intenta: FiguraGeometrica figura = new FiguraGeometrica();

Esto es coherente dado que una clase abstracta no tiene completa su implementacin y encaja bien con la idea de que algo abstracto no puede materializarse. Sin embargo utilizando el up-casting visto en el captulo dedicado a la Herencia si se puede escribir: FiguraGeometrica figura = new Circulo(. . .); figura.dibujar(); La invocacin al mtodo dibujarse resolver en tiempo de ejecucin y la JVM llamar al mtodo de la clase adecuada. En nuestro ejemplo se llamar al mtodo dibujarde la clase Circulo.

4.3 Interfaces
Concepto de Interface
El concepto de Interface lleva un paso ms adelante la idea de las clases abstractas. En Java una interface es una clase abstracta pura, es dcir una clase donde todos los mtodos son abstractos (no se implementa ninguno). Permite al diseador de clases establecer la forma de una clase (nombres de mtodos, listas de argumentos y tipos de retorno, pero no bloques de cdigo). Una interface puede tambin contener datos miembro, pero estos son siempre static y final. Una interface sirve para establecer un 'protocolo' entre clases. Para crear una interface, se utiliza la palabra clave interface en lugar de class. La interface puede definirse public o sin modificador de acceso, y tiene el mismo significado que para las clases. Todos los mtodos que declara una interface son siempre public. Para indicar que una clase implementa los mtodos de una interface se utiliza la palabra clave implements. El compilador se encargar de verificar que la clase efectivamente declare e implemente todos los mtodos de la interface. Una clase puede implementar ms de una interface.

Declaracin y uso
Una interface se declara: interface nombre_interface { tipo_retorno nombre_metodo ( lista_argumentos ) ; ... } Por ejemplo: interface InstrumentoMusical { void tocar(); void afinar();

String tipoInstrumento(); } Y una clase que implementa la interface: class InstrumentoViento extends Object implements InstrumentoM usical { void tocar() { . . . }; void afinar() { . . .}; String tipoInstrumento() {} } class Guitarra extends InstrumentoViento { String tipoInstrumento() { return "Guitarra"; } } La clase InstrumentoViento implementa la interface, declarando los mtodos y escribiendo el cdigo correspondiente. Una clase derivada puede tambin redefinir si es necesario alguno de los mtodos de la interface.

Referencias a Interfaces

Es posible crear referencias a interfaces, pero las interfaces no pueden ser instanciadas. Una referencia a una interface puede ser asignada a cualquier objeto que implemente la interface. Por ejemplo: InstrumentoMusical instrumento = new Guitarra(); instrumento.play(); System.out.prinln(instrumento.tipoInstrumento()); InstrumentoMusical i2 = new InstrumentoMusical(); //error.No se puede instanciar

Extensin de interfaces

Las interfaces pueden extender otras interfaces y, a diferencia de las clases, una interface puede extender ms de una interface. La sintaxis es: interface nombre_interface extends nombre_interface , . . . { tipo_retorno nombre_metodo ( lista_argumentos ) ; ... }

4.4 Variables polimrficas (plantillas): definicin, uso y aplicaciones


En Java, las variables que contienen objetos son variables polimrficas. El trmino polimrfico (literalmente: muchas formas) se refiere al hecho de que una misma variable puede contener

objetos de diferentes tipos (del tipo declarado o de cualquier subtipo del tipo declarado). El polimorfismo aparece en los lenguajes orientados a objetos en numerosos contextos, las variables polimrficas constituyen justamente un primer ejemplo. Observemos la manera en que el uso de una variable polimrfica nos ayuda a simplificar nuestro mtodo listar. El cuerpo de este mtodo es: for (Elemento elemento : elementos) elemento.imprimir(); En este mtodo recorremos la lista de elementos (contenida en un ArrayList mediante la variable elementos), tomamos cada elemento de la lista y luego invocamos su mtodo imprimir.El uso de herencia en este ejemplo ha eliminado la necesidad de escribir dos ciclos en el mtodo listar. La herencia evita la duplicacin de cdigo no slo en las clases servidoras sino tambin en las clases clientes de aquellas. public class CD { private String title; private String artist; private String comment; CD(String theTitle, String theArtist) { title = theTitle; artist = theArtist; comment = " "; } void setComment(String newComment) { ... } String getComment() { ... } void print() { ... } ... } public class DVD { private String title; private String director; private String comment; DVD(String theTitle, String theDirector) { title = theTitle;

director = theDirector; comment = " "; } void setComment(String newComment) { ... } String getComment() { ... } void print() { ... } ... } class Database { private ArrayList<CD> cds; private ArrayList<DVD> dvds; ... public void list() { for(CD cd : cds) { cd.print(); System.out.println(); } for(DVD dvd : dvds) { dvd.print(); System.out.println(); } } }
Publicado 3rd June 2012 por Freddy Gonzalez Meza

4.5 Reutilizacin del cdigo


Para reutilizar el cdigo creamos nuevas clases pero, en lugar de partir de cero, partimos de clases, relacionadas con nuestra clase, que han sido ya creadas y depuradas. El truco est en usar las clases sin ensuciar el cdigo existente. Una forma de hacer esto es crear objetos de nuestras clases existentes dentro de la nueva clase. Esto se conoce como composicin porque la nueva clase est compuesta de objetos de clases existentes. Estamos reutilizando la funcionalidad del cdigo, y no la forma. Otra forma es crear una nueva clase como un tipo de una clase ya existente. Tomamos la forma de la clase existente y aadimos cdigo a la nueva, sin modificar la clase existente. Esta forma de crear nuevos objetos se llamada herencia, y lo que hacemos es extender la clase en la que nos basamos para crear la nueva.

Composicin
Hasta ahora hemos usado la composicin de cierta manera, ej. cuando hacemos una interfaz grfica de usuario, nuestra clase de interfaz grfica esta compuesta por un frame, unos panel, botones, etc. todos estos objetos componen el objeto de interfaz grfica. Es decir que la composicin consiste en poner manejadores de objetos dentro de nuestra clase, estos manejadores de objetos no sern otra cosa que instancias de las clases en las que nos estamos basando para crear la nueva clase. Recordemos que la forma para determinar cundo usar composicin es cuando podemos decir que nuestra nueva clase tiene un elemento de otro tipo de objetos, por ejemplo un cronmetro tiene: horas, minutos y segundos, es decir que una clase Cronometro est compuesta por otras clases llamadas: Horas, Minutos y Segundos. Veamos como seria esta clase: public class Cronometro { Horas h; Minutos m; Segundos s; String cadena; int seg,min,hor; public Cronometro() { seg=0; min=0; hor=0; h = new Horas(); m = new Minutos(); s = new Segundos(); cadena = new String("0 : 0 : 0"); } public String avanzar(){ seg = s.forward(); if(seg==0){ min=m.forward(); if(min==0){

hor=h.forward(); } } cadena = hor + " : " + min + " : " + seg; return cadena; } public String reset(){ seg = s.reset(); min = m.reset(); hor = h.reset(); cadena = hor + " : " + min + " : " + seg; return cadena; } } Nuestra clase Cronometro est compuesta entre otras cosas por objetos del tipo Horas, Minutos y Segundos y a travs del constructor de nuestra clase creamos las instancias de cada una de ellas.

Das könnte Ihnen auch gefallen