Lio con las Interfaces

Raul
16 de Abril del 2003
Vamos a ver si me aclaro, una interface es una como una clase que tan
solo contiene constantes y métodos abstractos, ósea que carecen de
implementación, entonces mis preguntas:

a) Si yo implemento una interface, tengo que implementar todos sus métodos.
Absolutamente todos??

b) Si yo "uso" una interface (ósea que no la implemento), puedo usar sus
métodos declarando una variable del tipo de la interface separada de un
punto, me explico:
Si tenemos por ejemplo la interface Connection pues yo puedo hacer
perfectamente lo siguiente

Connection conexion;
conexion.createStatement();

Bien pues mi pregunta es ¿Por qué puedo usar ese método?, si se supone que
no tiene implementación (esta vacio??), y además en el API me dice que
devuelve un valor, el caso es que funciona perfectamente, pero no entiendo
por qué ese método me está devolviendo un valor cuando se supone que una
interface solo tiene métodos vacios.

c) Que diferencia hay entre usar una interface o implementarla(salvo que no
la declaras con el implements)?

Gracias.



Luis
16 de Abril del 2003
Hi Raul.
Voy a intentar explicar mas o menos que es y para que sirve un "interface".
Pues bien, simplemente un interface es, "Una declaracion de intenciones". Se trata de crear una forma de utilizar multiples clases que puedan ser utilizadas comunmente atraves de su interface. Dos clases cualquiera siempre y cuando tengan el mismo interface, son iguales(comparando por el interface por supuesto). Simplemente se trata de crear un asa que sirva para coger cualquier tipo de cacerola, bien sea grande, pequeña, redonda o cuadrada, nos viene dando igual siempre que contenga el interface que sera el asa y que para todas es el mismo.
Si bien, por ejemplo, implementamos un interface y creamos tres clases dentro. La primera la llamamos setValor(), la segunda getValor() y la tercera getSQL(). Quedará asi:
---------------
public interface miInterface(){
public void setValor(String valor);
public String getValor();
public String getSQL();

}
---------------
Ahora creamos dos clases que van a implementar el mismo interface. La primera clase simplemente va a ser un panel con una imagen. Y la segunda clase va a ser un panel con una caja de texto.
Cuando implementamos un interface, todas las clases del interface tiene que ser creadas en la clase que lo implementa. Con lo que en la primera clase MiImagen (la llamaremos asi) tenemos el constructor y las tres clases que contiene el interfaces, y en la segunda clase MiTexto tambien tendra otras tres clases.
Ahora llegamos al punto clave. Para cada una de las clases las funciones se implementan de distinta manera, pq no es lo mismo asignar un valor a una caja de texto que a una imagen y sin embargo queremos que las dos sean tratadas del mismo modo.

Supongamos que la clase que utilizamos es la clase de la imagen (MiImagen). Si se llama a su funcion getValor, no va a poder devolver lo mismo que devolveria una caja de texto(MiTexto), con lo que implementamos codigo para que lo que nos devuelva sea el nombre de la imagen, por ejemplo. La funcion setValor lo que hará será asignar un nombre de imagen y la pinte en el panel. En principio la funcion getSQL() no se hace necesario escribir nada, la dejaremos vacia, pq esta clase no contiene ninguna sentencia SQL que podamos devolver con lo que devolveremos un valor nulo o "".
Ahora vamos a la otra clase MiTexto. En esta clase es sencillo puesto que la funcion setValor y getValor lo que harán será devolver y poner el String de la caja de texto.
Y la funcion getSQL devuelve, por ejemplo, la sentencia SQL que carga la caja de texto.

Dentro de cada una de las funciones del interface que contienen nuestras dos clases puedes escribir el codigo que desees, la unica condicion es que devuelva lo que pide la funcion y le pases los argumentos que piden. El interface lo unico que trata es de unificar la funcionalidad de varias clases por muy distintas que sean. Piensa que en una funcion te viene un Object y no sabes cual es, pero sabes que cualquier clase que venga tiene en comun un interface, pues simplemente tienes que referirte al Object como el interface y utilizar las funciones del mismo, que independientemente de la clase que sea hara la funcionalidad que has implementado dentro de las funciones de las clases.

Espero que con todo este mamotreto de texto no te haya liado mas. Espero que todo esto te ayude a entender un poco mas lo que es un interface y la potencia del mismo.
Un saludo