Está en la página 1de 9

Interfaces 04

JA
Bauman / Dcima

Java Electrotecnia
Interfaces
Java

Que son las interfaces?


Las interfaces, al igual que las clases y mtodos abstract, proporcionan plantillas de comportamiento
que se espera que implementen otras clases. Sin embargo, las interfaces proporcionan mucha mas
funcionalidad a Java y al diseo de clases y objetos que las clases y mtodos abstract simples. Ahora
exploraremos las interfaces: lo que son, por que son cruciales para obtener lo mximo del lenguaje Java
para sus propias clases y la manera de usarlas e implementarlas.

El problema de la herencia simple


Cuando se comenzaron a disear programas orientados a objetos el concepto de la jerarqua de clases
probablemente pareca casi milagroso. Dentro de ese solo rbol se puede expresar una jerarqua de tipos
de objetos diferentes; muchas relaciones que van de simples a moderadamente complejas entre objetos y
procesos en el mundo, y cualquier cantidad de puntos a lo largo del eje desde abstracto/general hasta
concreto/especifico. La jerarqua estricta de clases parece, a primera vista, ser simple, elegante y fcil de
usar.
Sin embargo, despus de pensarlo ms a fondo o tener una experiencia en diseo ms compleja puede
descubrir que la pura simplicidad de la jerarqua de clases es restrictiva, en particular cuando se tiene
algn comportamiento que necesita ser usado por clases que se encuentran en diferentes ramas del
mismo rbol.
Veamos ahora un ejemplo. Supongamos que tiene una jerarqua biolgica, con Animal en la parte
superior y las clases Mamfero y Pjaro bajo ella. Las cosas que definen a un mamfero incluyen que
son vivparos y tienen piel. El comportamiento o caractersticas de las aves incluyen el tener pico y poner
huevos. Hasta aqu, muy bien, no es as? Pero, cmo le hace para crear una clase para la criatura
Ornitorrinco, que tiene piel, pico y pone huevos? Se necesita combinar el comportamiento de dos
clases para formar la clase Ornitorrinco. Y debido a que las clases s1o pueden tener una superclase
inmediata en Java, este tipo de problemas no puede resolverse elegantemente.
Otros lenguajes OOP incluyen el concepto de herencia mltiple, el cual puede resolver este problema.
Con herencia mltiple una clase puede heredar de ms de una superclase y obtener comportamiento y
atributos de todas sus superclases a la vez. Mediante el uso de herencia mltiple se puede simplemente
dividir el comportamiento comn de las criaturas que ponen huevos en una sola clase
(PonedorDeHuevos) y luego crear nuevas clases que hereden de la superclase primaria y de la clase
PonedorDeHuevos. Por ejemplo, la clase Ornitorrinco podra heredar tanto de la clase Mamfero
como de la clase PonedorDeHuevos. Adems, se podra crear una clase CreaturaConPico que
tambin podra ser heredada por la clase Ornitorrinco.
El problema con la herencia mltiple es que hace que el lenguaje de programacin sea mucho ms
complejo y ms difcil de aprender, usar e implementar. Los asuntos sobre el llamado de mtodos y la
manera en que se organiza la jerarqua de clases llegan a ser ms complejos con la herencia mltiple y
ms propensos a confusin y ambigedad. Y debido a que uno de los objetivos de Java fue ser simple, se
elimin la herencia mltiple en favor de la herencia sencilla ms simple.
Entonces, cmo se resuelve el problema de la necesidad de comportamiento comn que no se ajusta
en la jerarqua de clases estricta? Java, tomndola prestada del Objective-C, tambin tiene otra jerarqua.
Esta se encuentra separada de la jerarqua de clases principal de clases con comportamiento mezclable.
Cuando se crea una nueva clase, dicha clase s1o tiene una superclase primaria, pero puede tomar y
escoger comportamientos comunes diferentes de la otra jerarqua
Esa otra jerarqua es la jerarqua de interfaz. Una interfaz Java es un conjunto de comportamientos
abstractos que pueden mezclarse con cualquier clase para aadir comportamiento a esa clase que no es
proporcionado por sus superclases. Especficamente, una interfaz Java s1o contiene definiciones de
mtodos abstractos y constantes, pero no variables de instancia ni implementaciones de mtodos.

2 POLITECNICO
Las interfaces son implementadas y usadas por medio de la biblioteca de clases de Java cada vez que
se espera que un comportamiento sea implementado por varias clases dispares. Por ejemplo, en la
jerarqua de clases de Java estn las interfaces java.lang.Runnable, java.util.Enumeration,
java.util.Observable, java.awt.image.ImageConsumer y
java.awt.image.ImageProducer. Las interfaces en la jerarqua de clases estndar de Java pueden
serle tiles en sus propios programas, por lo que asegrese de examinar la API para ver lo que se
encuentra disponible.

Diseo abstracto e implementaron concreta


Hasta ahora ha visto la diferencia entre el diseo y la implementacin en la programacin orientada a
objetos, donde el diseo de una cosa es su representacin abstracta y su implementacin es la
contraparte concreta del diseo. Ya vio esto con los mtodos, donde la firma de un mtodo define la
manera en que se use, pero la implementacin del mtodo puede darse en cualquier lugar de la jerarqua
de clases. Vio esto con las clases abstract, donde el diseo de la clase proporciona una plantilla para el
comportamiento, pero ese comportamiento no es implementado sino hasta ms abajo en la jerarqua.
Esta distincin entre el diseo y la implementacin de una clase o un mtodo es una parte crucial de la
teora de la programacin orientada a objetos. E1 pensar en trminos del diseo cuando organice las
clases le permite tener la imagen general sin preocuparse por los detalles de la implementacin. Y el tener
el diseo general ya definido cuando comienza la implementacin le permite concentrarse nicamente en
los detalles de la clase con la que este trabajando. Esta versin de programacin de "pensar globalmente y
actuar localmente" proporciona una forma poderosa de pensamiento de como sus clases, sus programas y
su diseo general estn organizados y cmo se interrelacionan.
Una interfaz esta compuesta por un conjunto de firmas de mtodos sin implementaciones, que
conforman el cuerpo de un diseo puro. Mezclando una interfaz con la clase propia se integra ese diseo
en la implementacin. Por lo tanto, ese diseo puede ser incluido en forma segura en cualquier lugar de la
jerarqua de clases, debido a que no hay detalles especficos de la clase sobre la manera en que se
comporta una interfaz, no hay nada que sobreponer, nada de que llevar Cuenta, sino simplemente el
nombre y los argumentos de un mtodo.
Que hay acerca de las clases abstract? No proporcionan las clases abstractas este mismo
comportamiento? Si y no. Las clases abstract y los mtodos abstract que estn dentro de ellas
proporcionan una separacin del diseo y la implementacin, lo que le permite dividir el comportamiento
comn en una superclase abstracta. Pero las clases abstractas pueden, y frecuentemente lo hacen,
contener algunos datos concretos (tales como las variables de instancia).
Y usted puede tener una superclase abstracta con mtodos abstractos y normales, confundiendo en
esta forma la distincin.
Lo que es mas, una clase abstract pura con un solo mtodo abstract no es tan poderosa como
una interfaz. Una clase abstract es simplemente otra clase, ya que hereda de alguna otra clase y tiene
un lugar en la jerarqua. Las clases abstract no pueden ser compartidas entre diferentes partes de la
jerarqua de clases en la misma forma en que se puede con las interfaces. No pueden ser mezcladas con
otras clases que necesiten su comportamiento. Para obtener el tipo de flexibilidad de comportamiento
compartido a travs de la jerarqua de clases se necesita una interfaz.
Puede pensar sobre la diferencia entre el diseo y la implementacin de cualquier clase Java como la
diferencia entre la jerarqua de interfaces y la jerarqua de diseos. La jerarqua de clases con herencia
nica contiene las implementaciones en donde las relaciones entre las clases y los comportamientos estn
rgidamente definidos. Sin embargo, la jerarqua de interfaces mezclables con herencia mltiple contiene el
diseo y pueden ser usadas libremente en cualquier lugar que se necesiten de la implementacin. Esta es
una forma poderosa de pensar acerca de la organizacin del programa. Aunque cueste un poco de trabajo
acostumbrarse a ella, se recomienda grandemente.

POLITECNICO 3
Interfaces
Java

Interfaces y clases
Las interfaces y clases, a pesar de sus definiciones diferentes, tienen mucho en comn. Las interfaces,
al igual que las clases, se declaran en archivos fuente con una interfaz en un archivo. Al igual que las
clases, tambin se compilan usando el compilador Java hacia archivos .class. Y en la mayora de los
casos, en cualquier lugar que se puede usar una clase (como tipo de dato para una variable, como el
resultado de un casting, etctera) tambin se puede usar una interfaz.
Casi en cualquier lugar en donde hay un nombre de clase, en cualquiera de los ejemplos o anlisis de
este libro, se puede sustituir por un nombre de interfaz. Los programadores Java a menudo dicen clase
cuando quieren decir clase o interfaz. Las interfaces complementan y extienden el poder de las clases, y
ambas pueden ser tratadas casi exactamente igual. Una de las pocas diferencias entre ellas es que una
interfaz no puede ser instanciada: new slo puede crear una instancia de una clase.

Implementacin y uso de interfaces


Ahora que ya entendi lo que son las interfaces y por que son poderosas (la programacin genrica),
es tiempo de pasar a los fragmentos actuales de cdigo (la programacin a detalle). Hay dos cosas que
puede hacer con las interfaces: usarlas en sus propias clases y definir sus propias interfaces.
Comenzaremos con lo primero:

La palabra clave implements

Para usar una interfaz se incluye la palabra clave implements como parte de la definicin de clase.
Por ejemplo, para usar una interfaz llamada miInterfaz con una clase llamada miApplet se podra
usar la siguiente definicin:

public class miApplet extends JApplet // JApplet es la superclase


implements miInterface { // pero tambin tiene el
// comportamiento de myInterface
...
}

Debido a que las interfaces solamente proporcionan definiciones de mtodos abstractos, usted tiene
que implementar esos mtodos en sus propias clases usando las mismas firmas de mtodo de la interfaz.
Observe que una vez que incluye una interfaz tiene que implementar todos los mtodos de esa interfaz, no
puede tomar y escoger los mtodos que necesite. Mediante la implementacin de una interfaz les indica a
los usuarios de su clase que se soportara todo lo de esa interfaz. (Observe que esta es otra diferencia
entre las interfaces y las clases abstractas; las subclases de estas ultimas pueden escoger que mtodos
implementar o sobreponer, y pueden ignorar a los dems.)
Una vez que su clase implementa una interfaz, las subclases de su clase heredaran estos nuevos
mtodos (y podrn sobreponerlos o sobrecargarlos) al igual que si su superclase los hubiera definido. Si su
clase hereda de una superclase que implementa una interfaz dada, no tiene que incluir la palabra clave
implements en su propia definicin de clase.

Examinemos ahora un ejemplo simple, la creacin de la nueva clase GoldenRetriever. Suponga que
ya tiene una buena implementacin de la ciase Animal y una interfaz, ComoAnimal, que representa lo que se espera
que sean capaces de hacer los animales. Usted necesita que GoldenRetriever sea un animal, pero que tambin
tenga caractersticas de perro, tal como la habilidad de rodar sobre l. A continuacin se presenta la manera de

4 POLITECNICO
expresar todo esto (no se preocupe por ahora acerca de la definicin de estas interfaces, ya que posteriormente
aprender ms sobre esto):

interface ComoAnimal {
void comer();
void dormir();
...
}

class Animal implements ComoAnimal {


private int edad;
private int peso;
}

interface ComoPerro {
void rodar();
void arruinarCespedDelVecino();
}

class GoldenRetriever extends Animal implements ComoPerro {


... // comer()puede causar arruinarCespedDelVecino (un comportamiento nico)
}

Observe que la clase GoldenRetriever no tiene que decir implements ComoAnimal, debido a
que mediante la extensin de Animal, ya lo tiene! Una de las cosas agradables acerca de esta estructura
es que se puede cambiar de opinin acerca de lo que la clase GoldenRetriever extiende (por ejemplo,
si se implementa de improviso una clase Perro muy buena), y aun as la clase GoldenRetriever
comprender las mismas dos interfaces.

class Perro implements ComoPerro {


private int edadEnAosDePerro;
...
}

class GoldenRetriever extends Perro implements ComoAnimal {


... // Los usuarios de GoldenRetriever nunca necesitan saber
// acerca del cambio.
}

Implementaron de varias interfaces


A diferencia de la jerarqua de clases con herencia simple, usted puede incluir tantas interfaces como
necesite en sus propias clases y las clases implementaran el comportamiento combinado de todas las
interfaces incluidas. Para incluir varias interfaces en una clase, simplemente separa los nombres con
comas:

class GoldenRetriever extends Animal implements ComoPerro, ComoMascota {


...
}

POLITECNICO 5
Interfaces
Java

Observe que pueden resultar complicaciones con la implementacin de varias interfaces, ya que, que
pasa si dos interfaces diferentes detienen el mismo mtodo? Hay tres combinaciones que pueden resolver
esto:

? Si los dos mtodos en cada una de las interfaces tienen firmas idnticas, usted implementa un
mtodo en su clase y esa definicin satisface a ambas interfaces.
? Si los dos mtodos tienen diferentes listas de parmetros, este es un caso simple de sobrecarga de
mtodo; tiene que implementar ambas firmas de mtodo y cada definicin satisface su definicin de
interfaz respectivo.
? Si los dos mtodos tienen la misma lista de parmetros, pero difieren en tipo de retorno, no puede
crear un mtodo que satisfaga a ambos (recuerde que la sobrecarga de mtodos es activada por la
lista de parmetros y no por el tipo de retorno). En este caso, el tratar de compilar una clase que
implemente ambas interfaces producir un error de compilacin. Este problema hace pensar que sus
interfaces tienen algunas fallas de diseo que necesitan ser reexaminadas.

Otros usos de las interfaces


Recuerde que casi en cualquier lugar en que puede usar una clase, en vez de ella, puede usar una
interfaz. Por ejemplo, puede declarar que una variable sea de un tipo de interfaz de la manera siguiente:

Runnable aRunnableObject = new MyAnimationClass();

Cuando se declare que una variable sea de un tipo de interfaz, simplemente significa que cualquier
objeto al que se refiera la variable se espera que tenga implementada esa interfaz, esto es, se espera que
comprenda todos los mtodos que esa interfaz especifica. Se supone que se mantiene una promesa hecha
entre el diseador de la interfaz y sus implementadores eventuales. En este caso, debido a que
ARunnableObject contiene un objeto de tipo Runnable, la suposicin es de que se puede llamar a
aRunnableObject.run().

Lo importante en esta situacin es que aunque se espera que aRunnableObject sea capaz de tener
un mtodo run(), usted podra escribir este cdigo mucho antes de que sea implementada (o hasta
creada!) cualquier clase que califique. En la programacin orientada a objetos tradicional, para obtener el
mismo efecto se esta forzado a crear una clase con implementaciones de manejador (stub).

Tambin puede convertir objetos mediante casting hacia una interfaz, al igual que como puede
convertir objetos hacia otras clases. Por ejemplo, regresemos a la definicin de la clase
GoldenRetriever, que implement las interfaces ComoAnimal (por medio de su superclase Animal) y
ComoPerro.
Aqu convertir, mediante casting, instancias de GoldenRetriever hacia clases e interfaces:

6 POLITECNICO
GoldenRetriever unGoldenRetriever = new GoldenRetriever();
Animal anAnimal = (Animal) unGoldenRetriever;
ComoAnimal unComoAnimal = (ComoAnimal)unGoldenRetriever;
ComoPerro unComoPerro = (ComoPerro) unGoldenRetriever;

unAnimal.comer(); // los animales comen


unAnimal.dormir(); // y duermen

unComoAnimal.rodar(); // <- error, cosas que son ComoAnimal no ruedan


unComoPerro.rodar() ; // pero las cosas que son ComoPerro si lo hacen

unGoldenRetriever.comer(); // un GoldenRetriever puede hacer todo esto


unGoldenRetriever.dormir()
unGoldenRetriever.rodar();
unGoldenRetriever.arruinarCespedDelVecino();

Las declaraciones y castings estn usadas en este ejemplo para restringir el comportamiento de un
GoldenRetriever actuar como un simple animal o perro, pero no ambos. Esto es mostrado por los objetos
unAnimal, unComoAnimal y unComoPerro.

Por ultimo, observe que aunque las interfaces se usan generalmente para mezclar comportamientos de otras
clases (firmas de mtodo), las interfaces tambin pueden usarse para mezclar Constantes generalmente tiles. Por
ejemplo, si una interfaz define un conjunto de constantes, y luego varias clases usan esas constantes, los valores de
esas constantes podran ser cambiados globalmente sin tener que modificar varias clases. Este es otro ejemplo
en donde el uso de interfaces para separar el diseo de la implementacin puede hacer que el cdigo sea
ms general y ms fcilmente mantenible.

Creacin de interfaces
Despus de usar interfaces durante un tiempo, el siguiente paso es definir sus propias interfaces. Las
interfaces se parecen mucho a las clases, ya que son declaradas en forma muy similar y pueden ser
acomodadas en una jerarqua. Sin embargo, hay reglas que se deben seguir para la declaracin de
interfaces.

Interfaces nuevas
Para crear una interfaz nueva tiene que declararla de la manera siguiente:

public interface Crece {

Esto es, efectivamente, igual a una declaracin de clase, con la palabra interface reemplazando a la
palabra class. Dentro de la definicin de interfaz se tienen mtodos y constantes. Las definiciones de
mtodos dentro de la interfaz son mtodos public y abstract, y se les puede declarar en forma
explcita como tales o sern cambiados a mtodos public abstract en caso de que no se incluyan
estos modificadores. No se puede declarar un mtodo dentro de una interfaz para que sea private o
protected.

POLITECNICO 7
Interfaces
Java

public interface Crece {


public abstract void crecer(); //public y abstract explcitamente
void crecerAlMaximo(); // public y abstract efectivamente
}

Observe que, al igual que como sucede con los mtodos abstract en las clases, los mtodos que
estn dentro de las interfaces no tienen cuerpo. Recuerde que una interfaz es diseo puro y no hay
implementacin involucrada.

Adems de los mtodos, las interfaces tambin pueden tener variables, pero estas variables deben ser
declaradas public, static y final (haciendo que sean constantes). Al igual que con los mtodos,
puede definir explcitamente una variable para que sea public, static y final, o ser definida
implcitamente como tal en caso de que no utilice los siguientes modificadores:

public interface Crece {


public static final int incremento = 10;
long maxnum = 1000000; // se convierte en public, static y final

public abstract void crecer(); //public y abstract explcitamente


void crecerAlMaximo(); // public y abstract efectivamente
}

Las interfaces deben tener proteccin pblica y de paquete, al igual que las clases. Sin embargo,
observe que las interfaces que no tienen modificador public no convierten automticamente sus
mtodos a public y abstract o sus constantes a public. Una interfaz que no es public tambin
tiene mtodos y constantes no public que slo pueden ser usados por las clases y otras interfaces del
mismo paquete.

Las interfaces, al igual que las clases, pueden pertenecer a un paquete mediante la adicin de una
definicin de paquete a la primera lnea. Las interfaces tambin pueden importar otras interfaces y clases
de otros paquetes, al igual que las clases.

Interfaces dentro de mtodos


Debido a que se supone que los mtodos que estn dentro de las interfaces son abstractos y se aplican
a cualquier tipo de clase, cmo puede definir parmetros para ellos?, no sabe cual clase los usara!
La respuesta se encuentra en el hecho de que usted puede usar un nombre de interfaz en cualquier
1ugar donde use un nombre de clase, como ya aprendi hoy. Al definir los parmetros de mtodo como
de tipo de interfaz usted puede crear parmetros genricos que se apliquen a cualquier clase que pueda
usar esta interfaz.
Por ejemplo, tome la interfaz ComoAnimal, la cual define mtodos (sin argumentos) para comer() y
dormir(). Tambin podra haber un mtodo para reproducir(), que tiene un argumento: el animal
mismo. De que tipo va a ser este argumento? No puede ser Animal debido a que debe ser una clase que
sea ComoAnimal (que use la interfaz) sin ser en realidad un animal. La solucin es declarar el argumento
como ComoAnimal en la siguiente interfaz:

8 POLITECNICO
public interface ComoAnimal {
public abstract reproducir(ComoAnimal otroAnimal) {
...
}
}

Luego, en una implementacin para este mtodo en una clase, se puede tomar el argumento genrico
ComoAnimal y convertirlo mediante casting hacia el objeto adecuado:

public class GoldenRetriever extends Animal {


public reproducir(ComoAnimal otroAnimal) {
GoldenRetriever unGoldenRetriever = (GoldenRetriever)otroAnimal;
...
}
}

Extensin de interfaces
Al igual que como sucede con las clases, las interfaces pueden ser organizadas en una jerarqua.
Cuando una interfaz hereda de otra interfaz, esa "subinterfaz" adquiere todas las definiciones de
mtodo y constantes que defini su <superinterfaz>. Para extender una interfaz utilice la palabra clave
extends, al igual que en una definicin de clase:

public interface ComoPerro extends ComoMascota {


}

Observe que, a diferencia de las clases, la jerarqua de interfaces no tiene equivalente de la clase
0bject, ya que la jerarqua de interfaces no esta enraizada en ningn punto. Las interfaces pueden existir
completamente por su cuenta o heredar de otra interfaz.
Observe tambin que, a diferencia de la jerarqua de clases, la jerarqua de interfaces tiene herencia
mltiple. Por ejemplo, una sola interfaz puede extender tantas clases como necesite hacerlo (separadas
por comas en la parte extends de la definicin), y la nueva interfaz contendr una combinacin de todos
los mtodos y constantes de sus madres.

public interface ComoPerro extends ComoMascota, Amigable {


...
}

En las interfaces con herencia mltiple, las reglas para el manejo de conflictos de nombre de mtodo
son las mismas que para las clases que usan varias interfaces, y los mtodos que difieren solamente en el
tipo de retorno darn como resultado un error de compilacin.

POLITECNICO 9

También podría gustarte