16 febrero 2009

interfaces

Interfaces

Definición

Un interface es una colección de declaraciones de métodos (sin definirlos) y también puede incluir constantes.
Las clases que implementen ( implements) el interface han de definir obligatoriamente la función del interface.
El papel del interface es el de describir algunas de las cara cterísticas de una clase.

Diferencia entre un interface y una clase abstracta


Un interface es simplemente una lista de métodos no implementados, además puede incluir la declaración de constantes. Una clase abstracta puede incluir métodos implementados y no implementados o abstractos, miembros dato constantes y otros no constantes.

Una clase solamente puede derivar extends de una clase base, pero puede implementar varios interfaces. Los nombres de los interfaces se colocan separados por una coma después d e la palabra reservada implements.

Vamos a crear un interface denominado Parlanchin que contenga la declaración de una función denominada habla.

public interface Parlanchin {
public abstract void habla();
}

Hacemos que la jerarquía de clases que deriva de la clase base Animal implemente el interface Parlanchin

public abstract class Animal implements Parlanchin{
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!");
}
}

Ahora veamos otra jerarquía de clases completamente distinta, la que deriva de la clase base Reloj. Una de las clases de dicha jerarquía Cucu implementa el interface Parlanchin y por tanto, debe de definir obligatoriamente la función habla declarada en dicho interface.

public abstract class Reloj {
}
class Cucu extends Reloj implements Parlanchin{
public void habla(){
System.out.println("¡Cucu, cu cu, ..!");
}
}

Definamos la función hazleHablar de modo que conozca al objeto que se le pasa no por una clase base, sino por el interface Parlanchin. A dicha función le podemos pasar cualquier objeto que implemente el interface Parlanchin, este o no en la misma jerarquía de clases.

public class PoliApp {
public static void main(String[] args) {
Gato gato=new Gato();
hazleHablar(gato);
Cucu cucu=new Cucu();
hazleHablar(cucu);
}
static void hazleHablar(Parlanchin sujeto){
sujeto.habla();
}
}

Al ejecutar el programa, veremos que se imprime en la consola ¡Miau!, por que a la función hazleHablar se le pasa un objeto de la clase Gato, y después ¡Cucu, cucu, ..! por que a la función hazleHablar se le pasa un objeto de la clase Cucu.

Si solamente hubiese herencia simple, Cucu tendría que derivar de la clase Animal (lo que no es lógico) o bien no se podría pasar a la función hazleHablar.

Con interfaces, cualquier clase en cualquier familia puede implementar el interface Parlanchin, y se podrá pasar un objeto de dicha clase a la función hazleHablar. Esta es la razón por la cual los interfaces proporcionan más posibilidades que el que se puede obtener de una simple jerarquía de clases

No hay comentarios: