Interface con varias implementaciones de tipos

21 views
Skip to first unread message

Jonathan Vila López

unread,
Mar 24, 2014, 1:09:38 PM3/24/14
to barcel...@googlegroups.com
Hola.

Tengo una clase que es una primera de muchas parecidas......

Tiene 3 o 4 metodos que quiero que un conjunto de clases cumpla, pero cada una de ellas usara unos tipos diferentes tanto de retorno como de argumento.

miclase {

     private TipoUnoRS transformaRQ(TipoUnoRQ objeto) {
     ...
     }

     private TipoDosRS transformaRS(TipoDosRQ objeto) {
     ...
     }

     private void ejecuta(TipoTresRQ objeto) {
     ...
     }
}

Como creeis que podria crear un Interface que me defina estos tres metodos y que obligue a las clases que lo implementan a tener esos 3 metodos, PERO DEJANDO LIBERTAD DE QUE LOS TIPOS NO SEAN ESOS EN CONCRETO.

Saludos.

Loïc Prieto

unread,
Mar 24, 2014, 2:02:48 PM3/24/14
to barcel...@googlegroups.com
Se me ocurre que podrías dividir las interfaces en varias interfaces funcionales, crear una genérica que vas agregando en plan composición.

Por ejemplo, una interfaz tal que así:
interface Transformador<A,R> {
    R transforma(A fuente);
}

Entonces, las clases que hagan uso de esta interfaz puede implementarla con los tipos que prefieran:

public class TransformadorCompuesto implements Transformador<Tipo1RQ,Tipo1RS>, Transformador<Tipo2RQ,Tipo2RS> {
    Tipo1RS transforma(Tipo1RQ fuente) { ... }
    Tipo2RS transforma(Tipo2RQ fuente) { ... }
}

Podrías crearte más interfaces compuestas genéricas para agrupar varias de estas transformaciones si necesitas que una clase dada implemente una interfaz de 3 transformaciones fijas. Tambiéns podrías crear interfaces que agrupen varias de estas interfaces transformadoras (extendiendo varias veces la transformadora con distintos parametros o incluso genéricos) si quieres que ciertas clases implementen tres transformaciones siempre.
De la misma forma, puedes crearte una interfaz funcional para el método ejecuta, también parametrizada, y agregarla o en la clase, o en otra interfaz que extienda las otras interfaces transformadoras.

No sé si me he explicado muy bien, vaya.


--
Has recibido este mensaje porque estás suscrito al grupo "Barcelona JUG" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un mensaje de correo a barcelona-ju...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Loïc Prieto

unread,
Mar 24, 2014, 2:03:39 PM3/24/14
to barcel...@googlegroups.com

Jonathan Vila Lopez

unread,
Mar 24, 2014, 4:02:32 PM3/24/14
to barcelona-jug@googlegroups com
Hola

Oki,pero lo que no quiero es tener tantos interfaces como clases implementacion tenga...... Lo he probado con Generics y wildcards pero claro, luego la implementacion debe seguir el mismo tipo generic.....

Me gustaria algo como :

public interface Interf {
  public ? metodoTrxRQ(? objeto);
  public ? metodoTrxRS( ? objeto );
 public boolean metodoExecute( ? objeto );
}

public class Miclase implements Interf {
  public String metodoTrxRQ(Integer objeto) .....
  public Integer metodoTrxRS(String objeto) ....
  public boolean metodoExecute( String objeto) ...
}

public class Miclase2 implements Interf {
  public MiObjectoComRQ metodoTrxRQ(MiOtroObjeto objeto) ....
  public MiObjectoComRS metodoTrxRS(MiObjetoRQ objeto) ....
  public boolean metodoExecute(MiObjetoComRS objeto) ....
}

.... and so on ....



Inline image 2

 Jonathan Vila     
 jonath...@gmail.com

 

Loïc Prieto

unread,
Mar 24, 2014, 6:05:48 PM3/24/14
to barcel...@googlegroups.com
A estas alturas sólo se me ocurre lo obvio, que es:
interface Interf {
    Object metodoTrxRQ(Object objeto);
    Object metodoTrxRS(Object objeto);
    boolean metodoExecute(Object objeto);
}

Pero me imagino que eso lo has pensado ya al instante en otro momento y descartado. Tengo algo de curiosidad por qué necesitarías algo así. Sobre todo que luego es imposible no enfarragar con ifs si tienes que controlar el tipo de datos devuelto. Aunque si son tratados de forma genérica, supongo que da igual.

Max Pimm

unread,
Mar 24, 2014, 6:43:02 PM3/24/14
to barcel...@googlegroups.com
Puedes paramerizar tantos tipos como necesitas en el interface. Sí son estos tres métodos parece que hay 5 tipos que quieres parametrizar.

public interface Interf<T, U, V, X, Y> {
  T metodoTrxRQ(U u);
    V metodoTrxRS(X x);
    boolean metodoExecute(Y y);
}

public class MiClase implements Interf<String, Integer, Integer, String, String> {
public String metodoTrxRQ(Integer i) {...}
public Integer metodoTrxRS(String s) {...}
public boolean metodoExecute(String s) {...}
}

Max


Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a barcelona-ju...@googlegroups.com.

Jonathan Vila Lopez

unread,
Mar 25, 2014, 4:14:20 AM3/25/14
to barcelona-jug@googlegroups com
eyyyy Max...... ese uso de generics me gusta....... no lo habia pensado...... ahora lo pruebo :)


Inline image 2

 Jonathan Vila     
 jonath...@gmail.com

 



Sergi Martínez

unread,
Mar 25, 2014, 5:16:06 AM3/25/14
to barcel...@googlegroups.com
Yo el tema generics lo llevaba fatal hasta que encontré esta joya: http://shop.oreilly.com/product/9780596527754.do

Un libro enteramente dedicado al tema. Una gozada.


2014-03-25 9:14 GMT+01:00 Jonathan Vila Lopez <jonath...@gmail.com>:
ese uso de generics me gusta....... no lo habia pensado...... ahora lo pruebo :)




Sergi Martínez

unread,
Mar 25, 2014, 5:19:08 AM3/25/14
to barcel...@googlegroups.com
Otra cosilla, la clase AsyncTask de Android es un buen ejemplo de como utilizar varios: http://developer.android.com/reference/android/os/AsyncTask.html

Esta clase permite ejecutar código en otro thread de forma sencilla. Utiliza tres genericos. El tipo del array de objetos de entrada, el tipo con el que se notificará el progreso y el tipo que el thread secundario devolverá al principal. SI por algo no se van a utilizar, se puede declarar como <Void, Void, Void>. Void es una dummy class utilizada cuando nos obliga a poner genéricos pero en realidad no los necesitamos.

Loïc Prieto

unread,
Mar 25, 2014, 5:25:00 AM3/25/14
to barcel...@googlegroups.com
Muchas gracias por el enlace,Sergi!

La verdad es que lo que conozco de los genéricos ha sido más por pelearme con los proyectos, tanto JEE como Android, pero en el fondo me considero inexperto, así que le pegaré un buen vistazo a ese libro.


--

Sergi Martínez

unread,
Mar 25, 2014, 5:31:45 AM3/25/14
to barcel...@googlegroups.com
Joder, pues yo cuando veia a los pobretes de Blackberry que tenían que usar java 1.4 que no tenía genéricos me daban una lastima...


2014-03-25 10:25 GMT+01:00 Loïc Prieto <loic.se...@gmail.com>:
r el enlace,Sergi!

La verdad es que lo que conozco de los genéricos ha sido más por pelearme con los proyectos, tanto JEE como Android, pero en el fondo me considero inexperto, así que le pegaré un buen vistazo a ese libro.




Loïc Prieto

unread,
Mar 25, 2014, 5:39:22 AM3/25/14
to barcel...@googlegroups.com
Lo mismo dirán de nosotros dentro de 4 años cuando las nuevas generaciones sólo hayan probado un java con lambdas. "¿Cómo podrían trabajar antes?" y verán los churros de texto de interfaces implementadas inline y se llevarán las manos a la cabeza :$


--
Reply all
Reply to author
Forward
0 new messages