Autor Tema: Concepto de polimorfismo y variables polimórficas en Java.  (Leído 3376 veces)

arcanFAC

  • Visitante
Hola de nuevo a todos, despues de unos dias que tenia parado el curso por tema de examenes en la U, decidí retomar el curso en la entraga nº88  del curso de aprender java.

En donde nos pedian retomar el ejercicio anterior y ampliarlo, pero encuentro muchos problemas al intentarlo ya que no se como realizarlo, es decir veo que todos crean una lista y ahí guardan los diferentes objetos de tipo Producto, pero en mi caso lo que quiero guardar en ella son otras listas en donde guardo mis objetos de distinto tipo, el punto es que esta lista la declaro como <List> para guardar las listas pero no sé cómo hacer el iterator para imprimir la informacion de los productos, ya que no me deja utilizar los métodos lo cual es normal ya que no la estoy nombrando como tipo Producto, pero si la declaro como tipo Producto solo me deja utilizar los metodos de esta clase y no de sus subclases.

Resumiendo,  no sé como abarcar el problema teniendo en cuenta como yo diseñé el ejercicio anterior, así que acudo a ustedes para que me orienten diciéndome cual seria la mejor manera de resolverlo, o diseñando una clase que resuelva lo que pide el ejercicio si no es mucho problema.

Sin mas adjunto el ejercicio anterior para que pueda ser estudiado por ustedes y me puedan asesorar mejor.

Saludos.
« Última modificación: 04 de Mayo 2015, 08:37 por Alex Rodríguez »

Dan_SB

  • Avanzado
  • ****
  • Mensajes: 273
  • *<DanielsCK>*
    • Ver Perfil
Re:Concepto de polimorfismo y variables polimórficas en Java.
« Respuesta #1 en: 03 de Mayo 2015, 21:36 »
Hola arcanFAC!

Te recomiendo que por ahora imprimas los datos solamente utilizando el metodo (o funcion) de tu super clase producto. Para poder imprimir todos los datos de cada producto sin importar su tipo, se necesita el uso del instanceof y el casting que es algo que daras mas adelante (no falta casi nada! jeje) casting seria como una "conversion" de un objeto a otro tipo diferente mientras que el instanceof seria como decir si el objeto pertenece a una clase determinada (o si es de un tipo determinado).

Mira mas o menos como le hice para poder imprimir todos los datos de cada producto con el casting y el instanceof usando mi codigo viejo y diagrama:

Código: [Seleccionar]
package comidaHerencia;

public class testHerencia3 {
    public static void main(String[]args){
        EnvioDeProductos envio = new EnvioDeProductos();
        ProductoFresco tomate = new ProductoFresco("Tomate Perita","30/04/2015","L1021015","20/04/2015","Panamá");
        ProductoFresco manzana = new ProductoFresco("Manzanas","03/05/2015","L1022015","20/04/2015","EEUU");
        ProductoRefrigerado leche = new ProductoRefrigerado("Leche Estrella Azul","10/05/2015","L1118015","24/04/2015","España","C#12083");
        ProductoRefrigerado jugo = new ProductoRefrigerado("Jugo de naranja aleman","14/05/2015","L0912015","20/04/2015","Alemania","C#56785");
        ProductoRefrigerado queso = new ProductoRefrigerado("Queso nestle","14/05/2015","L1112015","02/04/2015","Panamá","C#67890");
        CongeladoAgua pescado = new CongeladoAgua("Corvina","14/7/2015","L2032015","10/04/2015","Panamá",-2.0);
        pescado.setLitrosAgua(5);
        pescado.setSal(283.5);
        CongeladoAgua cangrejo = new CongeladoAgua("Centella","15/8/2015","L1023015","11/04/2015","Panamá",-2.0);
        cangrejo.setLitrosAgua(3);
        cangrejo.setSal(170.1);
        CongeladoAgua rex = new CongeladoAgua("Vaca xxx","15/6/2015","L2012015","11/04/2015","Costa Rica",-1.8);
        rex.setLitrosAgua(5);
        rex.setSal(170.1);
        CongeladoAgua pulpo = new CongeladoAgua("Blue Ice","15/6/2015","L2309015","16/05/2015","Colombia",-2.0);
        pulpo.setLitrosAgua(2);
        pulpo.setSal(113.4);
        CongeladoNitrogeno cordero = new CongeladoNitrogeno("Cordero","20/6/2015","L2609015","20/05/2015","Argentina",-2.2);
        cordero.setMetodoCongelacion("Criogénica");
        cordero.setTiempoExposicion("6 meses");
        envio.añadirProducto(tomate);
        envio.añadirProducto(manzana);
        envio.añadirProducto(leche);
        envio.añadirProducto(jugo);
        envio.añadirProducto(queso);
        envio.añadirProducto(pescado);
        envio.añadirProducto(cangrejo);
        envio.añadirProducto(rex);
        envio.añadirProducto(pulpo);
        envio.añadirProducto(cordero);
        System.out.println("Productos del envio:");
        for(int i = 0; i < envio.getTamaño(); i++){
        if(envio.getPosicion(i) instanceof ProductoFresco){
            Object obj = envio.getPosicion(i);
            ProductoFresco aux = (ProductoFresco) obj;
            System.out.println(aux.imprimirInfo());
        }
        else if(envio.getPosicion(i) instanceof ProductoRefrigerado){
            Object obj = envio.getPosicion(i);
            ProductoRefrigerado aux = (ProductoRefrigerado) obj;
            aux.imprimirDatos();
        }
        else if (envio.getPosicion(i) instanceof CongeladoAgua){
            Object obj = envio.getPosicion(i);
            CongeladoAgua aux = (CongeladoAgua) obj;
            aux.imprimirDatos();
        }
        else if (envio.getPosicion(i) instanceof CongeladoNitrogeno){
            Object obj = envio.getPosicion(i);
            CongeladoNitrogeno aux = (CongeladoNitrogeno) obj;
            aux.imprimirDatos();
        }
        else
            System.out.println(envio.getPosicion(i).imprimirInfo());
    }
    }
}

Ejecucion:



Si se va a imprimir con iteradores, todos esos metodos para imprimir los datos tienen que ser tipo funciones ya que el void no se permite dentro del bucle.

Puedes hacer tus metodos para imprimir como este:

Citar
public String imprimirInfo(){
        return "Nombre del producto: " + getNombreProducto() + "\nFecha Caducidad: " + getFechaCaducidad() +
                "\nNumero de Lote: " + getNumeroLote() + "\nFecha de Envasado: " + getFechaEnvasado() +
                "\nPais de Origen: " + getPaisDeOrigen() + "\n\n";
    }

Esto si sera permitido en el bucle por ser una funcion... asi te ahorras de escribir muchos gets en la impresion al momento de iterar los productos!  :)
« Última modificación: 04 de Mayo 2015, 08:40 por Alex Rodríguez »
"Luchar por tus sueños y cumplirlos... eso es vivir.."

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:Concepto de polimorfismo y variables polimórficas en Java.
« Respuesta #2 en: 04 de Mayo 2015, 08:49 »
Hola arcanFAC, pega el código intentando hacer lo que quieres hacer, explíca qué es lo que intentas y indica en dónde te salta un error para ayudarte a corregirlo.

Salu2

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 381
    • Ver Perfil
Re:Concepto de polimorfismo y variables polimórficas en Java.
« Respuesta #3 en: 04 de Mayo 2015, 09:54 »
Segun lo que te leo, quieres iterar una lista de listas, con sus objetos dentro.

Esto se puede conseguir, hablo así a votepronto, con un bucle de Iterator sobre otro Iterator.

for (Iterator<List> iter = listaDeListas.iterator(); iter.hasNext();){

    for(Iterator<Producto> temp = iter.iterator(); temp.hasNext(); ) {
                  temp. next() <----- este es cada uno de los productos de las listas,
        }
}

Creo que por ahí va tu duda. Y me suena que en una ocasión lo resolví así yo.

P.D. donde pone List si sabes que son ArrayList lo cambias.
« Última modificación: 04 de Mayo 2015, 10:04 por Lorenzo31 »

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".