Foros aprenderaprogramar.com

Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: arcanFAC en 02 de Mayo 2015, 18:42

Título: Concepto de polimorfismo y variables polimórficas en Java.
Publicado por: arcanFAC en 02 de Mayo 2015, 18:42
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.
Título: Re:Concepto de polimorfismo y variables polimórficas en Java.
Publicado por: Dan_SB 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:

(http://i.imgur.com/d45HPt4.png)

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!  :)
Título: Re:Concepto de polimorfismo y variables polimórficas en Java.
Publicado por: Alex Rodríguez 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
Título: Re:Concepto de polimorfismo y variables polimórficas en Java.
Publicado por: Lorenzo31 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.