Java - Urgente!!!

 
Vista:

Urgente!!!

Publicado por Geronimo (23 intervenciones) el 19/01/2005 13:28:30
Tengo una coleccion con objetos de distintas clases (una super y 3 sub-clases) y en una consulta debo saber exactamente a que clase pertenece exactamente el objeto que obtengo de la coleccion. En principio, la coleccion siempre devuelve un objeto de la super-clase, pero necesito obtener el objeto con todas los atributos de sub-clase en caso de que la consulta me devolviera un objeto de alguna de las sub-clases.
Hay alguna manera de que el casting en la consulta se haga directamente a la clase a la que pertenece el objeto obtenido?
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

RE:Urgente!!!

Publicado por Nicolas (125 intervenciones) el 19/01/2005 14:45:39
Hola!!!!!!!!!

Se podria usar typeOf() pero creo q esta DEPRECATED. Entonces, podrias hacer un tuObjeto.getClass.getName() y asi sabes el nombre de la clase.

Salu2!!!!!!!!!!!!!
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

RE:Urgente!!!

Publicado por claudio (31 intervenciones) el 19/01/2005 17:52:18
mmmm.... yo pensaría un poco mejor el modelo de objetos que estás utilizando.
Vos tenés distintos tipos de objetos que en algún lugar de tu aplicación los estás quieriendo trabajar polimorficamente (o al menos eso te convendría), para esto lo que deberías hacer sería buscar una abstracción en común a todos los tipos de objetos que estás utilizando dentro de tu Collection, eso por un lado.

Por otro lado vos me estás diciendo que necesitas tener acceso a todos los atributos del objeto que te está devolviendo la Collection, ya sean de la superclase o de alguna subclase. Yo en realidad lo interpretaría de otra manera y te diría que lo que vos queres es hacer algo con los objetos de la Collection, que va a depender de la clase de la cual es cada objeto.

Teniendo los dos puntos anteriores en mente, lo que te puedo sugerir que hagas es delegarle la responsabilidad de lo que se tenga que hacer a cada objeto que está en la Collection. ¿como e esto? bien, trataré de dar un ejemplo:
Si vos tenés la clase Persona que tiene Nombre y Apellido y la clase Alumno que hereda de Persona que además tiene el nombre del curso al que asiste, y querés por ejemplo algo bien sencillo, que te imprima sus datos por un PrintStream como sería la consola, entonces vos podrías hacer que cada clase haga algo así:

En la clase Persona:
void imprimirEstado(PrintStream out) {
out.println(this.nombre);
out.println(this.apellido);
}

En la clase Alumno:
void imprimirEstado(PrintStream out) {
super.imprimirEstado(out);
out.println(this.nombreCurso);
}

Entonces en la iteración, vos harías algo así:

while(it.hasNext) {
Persona p = (Persona)it.next();
p.imprimirEstado(System.out);
}

Fijate que ahí logré que todos los objetos de la Collection se manejen polimorficamente (todos entienden el mensaje imprimirEstado), y a su vez el resultado de la operación que yo quería realizar va a contemplar el tipo del objeto con el cual estoy opernado.

Esto a veces se suele confundir con un doble dispatch, lo cual no es así, y eso te lo dejo para que lo investigues ;-)

Espero que sea de ayuda, cualquier cosa, vuelve a preguntar que trataré de ser más claro si no lo he sido
Claudio
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

RE:Urgente!!!

Publicado por Claudio (31 intervenciones) el 28/01/2005 00:22:08
Algo que quisiera recalcar es que la solución a este problema bien podría haber sido decir que se utilice un codigo como el siguiente:

Persona.class.isAssignableFrom(obj.getClass())

Donde no solo sabés que obj es puede ser una persona, sino que además puede ser un una subclase que puede ser asignado a una referencia de tipo persona.
O simplemente que utilice el viejo y conocido instanceof.

Pero me parece muchísimos más importante que cada vez que se quiera programar algo nos pongamos 5, 10 minutos para pensar en los objetos que van a formar parte del sistema y la relación que habrá entre ellos (eso se que es una de las definiciones de diseño), antes que en las "hakereadas" que me tengo que mandar para poder solucionar algún problema diario, recuerden que la "hackereada" de alguien de ayer, me puede tener hoy hasta las 21:00 en el laburo tratando de encontrarle solucion a algo que no se contemplo en su momento.
Por ejemplo, el tema de andar preguntando por todos lados sobre la clase del objeto, me lleva a que cada vez que quiero hacer algo con una instancia de esa clase tengo que estar preguntandole al objeto de que clase es. Mientras más cosas quiera hacer yo con las instancias de esa clase, más veces voy a preguntar por la clase de los objetos en todo mi sistema, y si hago eso con tooooodas las clases de mi sistema, es un caos total. Y todo esto, simplemente porque no me puse a pensar un minuto y haberme dado cuenta que la solución al problema era el uso del polimorfismo, con lo cual dejo en un solo lugar las funcionalidades para la clase y todas esas ventajas lindas que nosotros sabemos que tiene el trabajar con objetos y polimorfismo.

Espero que a alguien le interese este tema que me parece que es más crucial de lo que parece. La gente que ya esté hace más de 1 o 2 años en esto de la programación se habrá dado cuenta que aprenderse un nuevo lenguaje (C, C++, Java, C#, Groovy, Ruby, etc), es cuestión de aprenderse una nueva sintaxis y semantica, todo eso es solo una herramienta, lo más importante me parece a mi, es saber que hacer con esa herramienta para poder construir en lugar de destruir :-S.

Disculpen que me cuelgue nuevamente de un thread tan viejo, pero como dice un amigo mío: "tenía ganas de decir esto y lo dije."

Saludos
Claudio.

PD: Geronimo, espero sepas entender que esto no es de ninguna manera una crítica hacia tu persona, sino que intenta ser una crítica constructiva y una opinión hacia lo que hacemos con tanto gusto que es programar.
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