Java - Interfaz teoria

 
Vista:

Interfaz teoria

Publicado por mariano (3 intervenciones) el 30/05/2013 15:28:47
Buenos dìas,

Entiendo el uso de interfaz se utilice para lograr polimorfismo, obtener una especie de contrato entre la interfaz y las clases que la implementan, y otros usos mas, lo que no me queda claro es cuando se declara una variable del "tipo" interfaz pero se "instancia" con una clase que "implementa" la interfaz.

Ejemplo:

inicio programa

ClsInterfaz
cantidad int ()
total int ()
fin ClsInterfaz

ClsStock implementa ClsInterfaz
cantidad int ()
to do
total int ()
to do
fin ClsStock

main()

ClsInterfaz obj = new ClsStock

//en vez de hacer:

ClsStock obj = new ClsStock

fin main

fin programa
---

Espero que se entienda el ejemplo, lo que no entiendo cual es la diferencias ??

Muchas gracias !
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Interfaz teoria

Publicado por Tom (1831 intervenciones) el 30/05/2013 18:39:08
Puedes hacer esto:
1
2
ClsStock obj = new ClsStock();
ClsInterfaz iobj = obj;


pero no puedes hacer esto:
1
2
ClsInterfaz iobj = new ClsStock();
ClsStock obj = iobj;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Interfaz teoria

Publicado por mariano (3 intervenciones) el 30/05/2013 19:01:35
Gracias por responder, pero ...
otra forma seria:

¿Por qué se declara una variable del tipo interfaz?

Es decir, ¿por qué utilizar:

ClsInterfaz obj;
obj = new ClsStock();
obj.cantidad();

en lugar de:

ClsStock obj;
obj = new ClsStock();
obj.cantidad();

Saludos !
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Jhonnathan Emilio Cardona Saineda

Interfaz teoria

Publicado por Jhonnathan Emilio Cardona Saineda (328 intervenciones) el 31/05/2013 18:20:20
Hola mariano,
Te lo paso a explicar con un ejercicio que hice en mis tiempos de universidad. El trabajo que tenia que hacer era crear una estructura de dato que permitiera crear, guardar, eliminar, buscar, entre otros métodos un objeto. La estructura que utilicé fue una lista enlazada, que es muy común en libros de java. Cuando termine mi estructura llamada GestionDatos esta era la forma de utilizarla si se quería adicionar un objeto:

GestionDatos gestion= new GestionDatos();
gestion.adicionar(objeto1);
gestion.adicionar(objeto2);
gestion.adicionar(objeto3);

Esta estructura la utilice para gestionar los contactos de una agenda. Hasta allí iba todo bien. Luego creció el proyecto y me di cuenta que la estructura que había creado tenia muy pocas funcionalidades por lo que me toco utilizar la clase ArrayList. El mayor problema fue cambiar la clase y sus métodos ya que me toco remplazar la clase GestionDatos por ArrayList y estas son muy diferentes empezando que los métodos míos estaban en español (adicionar, eliminar, etc).
¿Pero como me hubiera evitado eso?
Lo que tenia que hacer en un principio era que mi clase GestionDatos debía implementar la interfaz java.util.List esto me haría utilizar los métodos add, delete, etc; los mismos que tiene ArrayList ya que esta clase también implementa la interfaz List de esta manera solo tenia que reemplazar el nombre de la clase. Si utiliza la interfaz List no importa que clase utilices ya que la interfaz define un contrato para el nombre de los metodos y otros objetos. Por lo que lo que mi trabajo tenia que ser asi:

List gestion= new GestionDatos();
gestion.add(objeto1);
gestion.remove(objeto1);
gestion.size();

Si queria cambiar GestionDatos por ArrayList solo tenia que cambiar la clase concreta sin problemas de acoplamiento.

List gestion= new ArrayList();
gestion.add(objeto1);
gestion.remove(objeto1);
gestion.size()

Si despues de un tiempo no quiero utilizar ArrayList y me dieron ganas de utilizar la clase vector, solo tengo que hacer un cambio ya que la clase Vector tambien implementa la interfaz List.

List gestion= new Vector();
gestion.add(objeto1);
gestion.remove(objeto1);
gestion.size()

Esto es una gran solucion, pero existe otro problema y es que a pesar de que solo toca hacer un cambio toca volver a compilar, empaquetar y desplegar por lo que existe una pequeña pero maluca dependencia en la instancia osea en el new Vector() o new ArrayList o new GestionDatos() para esto hay otra solución que es un patrón de diseño utilizado por muchos frameworks como EJB, SEAM entre otros llamado (inyeccion de dependencias) utilizado con la premisa de "Alta cohexion, bajo acoplamiento".
En fin espero no haberte enredado en esto ultimo y espero haberte aclarado un poco.
Saludos,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Interfaz teoria

Publicado por Mariano (3 intervenciones) el 06/06/2013 18:02:32
Exelente, gracias !
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar