Beruflich Dokumente
Kultur Dokumente
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.
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 ) ; ... }
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
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.