Autor Tema: Java el diseño de clases y herencia no debe ser contrario al mundo real CU00687B  (Leído 5515 veces)

adrit

  • Principiante
  • **
  • APR2.COM
  • Mensajes: 59
    • Ver Perfil
Hola,

Dejo mi solución para el ejercicio CU00687B

Esquema de herencia de clases. Saqué la  TestHerencia3 para que no confundan las flechas de cada objeto.


Código: [Seleccionar]
import java.util.Calendar;

public class Productos {
    private int numeroLote;
    private Calendar fechaCaducidad;

    public Productos(int numeroLote, Calendar fechaCaducidad) {
        this.numeroLote = numeroLote;
        this.fechaCaducidad = fechaCaducidad;
    }

    public void setNumeroLote(int numeroLote) {
        this.numeroLote = numeroLote;
    }

    public void setFechaCaducidad(int anio, int mes, int dia) {
        fechaCaducidad.set(anio, mes, dia);
    }
   
    public int getNumeroLote() { return numeroLote; }
   
    public Calendar getFechaCaducidad() { return fechaCaducidad; }
   
    public String toString() {
        return String.format("\nNumero de Lote :\t\t"+numeroLote+ "\n" + "Fecha de Caducidad :\t\t"
        +fechaCaducidad.getTime().toString());
    }
}



Código: [Seleccionar]
import java.util.Calendar;

public class ProductosFrescos extends Productos {
    private Calendar fechaEnvase;
    private String paisOrigen;
   
    public ProductosFrescos (int numeroLote, Calendar fechaCaducidad,
                                Calendar fechaEnvase, String paisOrigen) {
        super(numeroLote, fechaCaducidad);
        this.fechaEnvase = fechaEnvase;
        this.paisOrigen = paisOrigen;
    }

    public void setFechaEnvase (Calendar fechaEnvase) {
        this.fechaEnvase = fechaEnvase;
    }

    public void setPaisOrigen (String paisOrigen) {
        this.paisOrigen = paisOrigen;
    }

    public Calendar getFechaEnvase () { return fechaEnvase; }

    public String getPaisOrigen () { return paisOrigen; }

    public String toString () {
        return String.format   (super.toString()+"\nFecha de Envase :\t\t"+fechaEnvase.getTime()
                                .toString()+"\nPais de Origen :\t\t"+paisOrigen);
    }

}

Código: [Seleccionar]
import java.util.Calendar;

public class ProductosRefrigerados extends ProductosFrescos {
    private String codSupervision;

    public ProductosRefrigerados  (int numeroLote, Calendar fechaCaducidad,
                                   Calendar fechaEnvase, String paisOrigen,
                                   String codSupervision)
    {
        super(numeroLote, fechaCaducidad, fechaEnvase, paisOrigen);
        this.codSupervision = codSupervision;
    }

    public void setCodSupervision(String codSupervision) {
        this.codSupervision = codSupervision;
    }

    public String getCodSupervision() { return codSupervision; }

    public String toString() {
        return String.format(super.toString()+"\nCodigo Supervision Alimentaria:\t"+codSupervision);
    }
}

Código: [Seleccionar]
[code]import java.util.Calendar;

public class ProductosCongelados extends ProductosFrescos {
   
    private String tempMantenimiento;
   
    public ProductosCongelados  (int numeroLote, Calendar fechaCaducidad,
                                   Calendar fechaEnvase, String paisOrigen,
                                   String tempMantenimiento)
    {
        super(numeroLote, fechaCaducidad, fechaEnvase, paisOrigen);
        this.tempMantenimiento = tempMantenimiento;
    }

    public void setTempMantenimiento(String tempCongelacionRecomendada) {
       this.tempMantenimiento = tempMantenimiento;
    }
   
    public String getTempMantenimiento() { return tempMantenimiento; }
   
    public String toString() {
        return String.format(super.toString()+"\nTemperatura de mantenimiento:\t"+tempMantenimiento);
    }
}
[/code]

Código: [Seleccionar]
import java.util.Calendar;

public class ProdCongPorAire extends ProductosCongelados {

    //composición del aire con que fue congelado
    String porcentajeNitrogeno, porcentajeOxigeno, porcentajeDioxidoCarbono, porcentajeVaporAgua;

    public ProdCongPorAire  (int numeroLote, Calendar fechaCaducidad,
                                Calendar fechaEnvase, String paisOrigen,
                                String tempMantenimiento, String porcentajeNitrogeno,
                                String porcentajeOxigeno, String porcentajeDioxidoCarbono,
                                String porcentajeVaporAgua)
    {
        super(numeroLote, fechaCaducidad, fechaEnvase, paisOrigen, tempMantenimiento);
        this.porcentajeNitrogeno = porcentajeNitrogeno;
        this.porcentajeOxigeno = porcentajeOxigeno;
        this.porcentajeDioxidoCarbono = porcentajeDioxidoCarbono;
        this.porcentajeVaporAgua = porcentajeVaporAgua;
    }

    public String getComposicion() {
        return String.format("\nComposición aire al congelar :\n\t\t\t\tPorcentaje N:\t"+porcentajeNitrogeno+"\n\t\t\t\tPorcentaje O:\t"
        +porcentajeOxigeno+"\n\t\t\t\tPorcentaje CO2:\t" +porcentajeDioxidoCarbono+"\n\t\t\t\tPorcentaje vapor de agua: "+porcentajeVaporAgua);
    }

    public String toString() {
        return String.format(super.toString()+this.getComposicion());
    }
}

Código: [Seleccionar]
import java.util.Calendar;

public class ProdCongPorAgua extends ProductosCongelados {
   
    String salinidadAgua;
   
    public ProdCongPorAgua (int numeroLote, Calendar fechaCaducidad,
                            Calendar fechaEnvase, String paisOrigen,
                            String tempMantenimiento, String salinidadAgua)
    {
        super(numeroLote, fechaCaducidad, fechaEnvase, paisOrigen, tempMantenimiento);
        this.salinidadAgua = salinidadAgua;
    }

    public void setSalinidad (String salinidadAgua) {
        this.salinidadAgua = salinidadAgua;
    }
   
    public String getSalinidad () { return salinidadAgua; }
   
    public String toString() {
        return String.format(super.toString()+"\nSalinidad del agua:\t\t"+salinidadAgua);
    }
   
}

Código: [Seleccionar]
import java.util.Calendar;

public class ProdCongPorNitrogeno extends ProductosCongelados {
   
    String metodoCongelacion;
    int tiempoExposicion;
   
    public ProdCongPorNitrogeno   (int numeroLote, Calendar fechaCaducidad,
                                    Calendar fechaEnvase, String paisOrigen,
                                    String tempMantenimiento, String metodoCongelacion,
                                    int tiempoExposicion)
    {
        super(numeroLote, fechaCaducidad, fechaEnvase, paisOrigen, tempMantenimiento);
        this.metodoCongelacion = metodoCongelacion;
        this.tiempoExposicion = tiempoExposicion;
    }

    public void setMetodoCongelacion (String metodoCongelacion) {
        this.metodoCongelacion = metodoCongelacion;
    }
   
    public void setTiempoExposicion (int tiempoExposicion) {
        this.tiempoExposicion = tiempoExposicion;
    }
   
    public String getMetodoCongelacion() { return metodoCongelacion; }
   
    public int getTiempoExposicion() { return tiempoExposicion; }
   
    public String toString() {
        return String.format(super.toString()+"\nMetodo de congelacion:\t\t"+metodoCongelacion
        +"\nTiempo de exposicion en Nitrogeno:\t"+tiempoExposicion);
    }
   
}

Código: [Seleccionar]
import java.util.Calendar;
import java.util.Scanner;

public class TestHerencia3 {
    static Scanner sc = new Scanner(System.in);
    public static void main (String[] args) {
        Scanner sc = new Scanner(System.in);
        Calendar fechaEnvase = Calendar.getInstance();
        Calendar fechaCaducidad = Calendar.getInstance();
        fechaEnvase.set(2015,9,22);
        fechaCaducidad.set(2016,9,22);
        ProductosFrescos producto1 = new ProductosFrescos (42, fechaCaducidad,
                fechaEnvase, "Argentina");
        ProductosFrescos producto2 = new ProductosFrescos (43, fechaCaducidad,
                fechaEnvase, "Argentina");
        ProductosRefrigerados producto3 = new ProductosRefrigerados  (44, fechaCaducidad,
                fechaEnvase, "Argentina", "4258CA");
        ProductosRefrigerados producto4 = new ProductosRefrigerados  (45, fechaCaducidad,
                fechaEnvase, "Uruguay", "4258CB");
        ProductosRefrigerados producto5 = new ProductosRefrigerados  (46, fechaCaducidad,
                fechaEnvase, "Uruguay", "4258KJ");       
        ProdCongPorAire producto6 = new ProdCongPorAire (55, fechaCaducidad,
                fechaEnvase, "Argentina", "-5Cº", "25","25","10","40");
        ProdCongPorAire producto7 = new ProdCongPorAire (56, fechaCaducidad,
                fechaEnvase, "Argentina", "-3Cº", "27","23","12","38");
        ProdCongPorAgua producto8 = new ProdCongPorAgua (57, fechaCaducidad,
                            fechaEnvase, "Chile", "5cº", "4");
        ProdCongPorAgua producto9 = new ProdCongPorAgua (58, fechaCaducidad,
                            fechaEnvase, "Perú", "4cº", "3");
        ProdCongPorNitrogeno producto10 = new ProdCongPorNitrogeno(65, fechaCaducidad,
                                    fechaEnvase, "Bolivia", "3.4Cº", "Criogenico",20);
        System.out.println("Lista de productos: \n");
        System.out.println("Productos Frescos:");
        System.out.println(producto1.toString()); System.out.println(producto2.toString());
        System.out.println(producto3.toString());
        System.out.println("\nProductos Refrigerados:");
        System.out.println(producto4.toString());
        System.out.println(producto5.toString());
        pausa();
        System.out.println("\nProductos Congelados:");
        System.out.println(producto6.toString());
        pausa();
        System.out.println(producto7.toString()); System.out.println(producto8.toString());
        System.out.println(producto9.toString()); System.out.println(producto10.toString());
    }
   
    static void pausa() {
        System.out.println("\nPress any key to continue . . . ");
        sc.nextLine();
    }
}

Muchas gracias!!

Adrian

« Última modificación: 26 de Julio 2015, 20:01 por Alex Rodríguez »

Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Hola adrit

He revisado el ejercicio y paso a hacerte las observaciones que he considerado.

A. Un detalle importante que debemos manejar como programadores es la forma de nombrar las clases. En general los nombres de las clases deben estar en singular. Has usado nombres como ProductosFrescos. Esto no se considera adecuado porque no sigue la convención habitual. Cuando nos referimos a la creación de un objeto por ejemplo decimos "he creado un objeto ProductoFresco" y no "he creado un objeto ProductosFrescos". Esto te ocurre con todas las clases. Deberías tenerlo en cuenta.

B. Otro detalle es no contravenir con el diseño del código al mundo real. Según tu diseño un ProductoCongelado es un tipo de ProductoFresco. Esto no es correcto porque no se corresponde con  la realidad y ni siquiera se trata de una clase intermedia. El enunciado nos dice que hay 3 tipos de productos, por tanto lo adecuado es que de la clase Producto hereden las clases ProductoRefrigerado, ProductoFresco y ProductoCongelado.

El apartado b) del anunciado indica que se creen superclases intermedias que pueden o no corresponderse con el mundo real. Pero la idea es no ir en contra del modelo del mundo real, sino crear clases auxiliares que quizás no existan en el mundo real pero que puedan ayudar en la programación. Por ejemplo una clase intermedia ProductoRefrigeradoOCongelado serviría para agrupar características comunes de los productos congelados o refrigerados. Puedes ver un ejemplo de esto en https://www.aprenderaprogramar.com/foros/index.php?topic=2342

C. Has usado el método toString que no se explica en el curso hasta la entrega CU00694B. En general recomendamos seguir el curso paso a paso sin adelantarse ni introducir contenidos más avanzados que no hayan sido explicados. Aunque en este caso ya estás muy próximo a la terminación del curso y esto ya no es tan importante precisamente porque ya te quedan pocas entregas.

D. Otra cosa que se ve poco adecuada es usar String porcentajeNitrogeno. Dado que los porcentajes son valores numéricos, con los que se podrían hacer cálculos, no es adecuado declararlos como texto. Sería preferible usar tipos numéricos por ejemplo double. Lo mismo ocurre con salidadDelAgua

E. También poco adecuado el método main donde aparece

System.out.println(producto1.toString());
System.out.println(producto2.toString());
System.out.println(producto3.toString());

Ese tipo de código repetitivo en general hay que tratar de evitarlo. Para ello los elementos de un mismo tipo normalmente los agrupamos en un array o en una colección de objetos como ArrayList. De este modo usamos bucles para recorrerlos y tratarlos (por ejemplo para mostrar datos por pantalla).

Aquí puedes ver un ejemplo de tratamiento como colección: https://www.aprenderaprogramar.com/foros/index.php?topic=2935


Este ejercicio sería razonable repetirlo para corregir todos los detalles comentados y alguno más que pueda aparecer. Al corregir diseños no adecuados nos sirve de refuerzo para recordarlo cuando creemos códigos en el futuro.

Saludos.
« Última modificación: 24 de Abril 2016, 13:12 por Alex Rodríguez »

adrit

  • Principiante
  • **
  • APR2.COM
  • Mensajes: 59
    • Ver Perfil
Hola Mario,

Estaba muy orgulloso de mi código  ;). Luego de ver que todo lo que escribí funcionaba (o mejor dicho, hacía algo sin dar error) me había puesto muy contento.

Hablando un poco mas en serio. Creo que es la primera vez que recibo tu devolución, por esto, ademas de decirte que es todo un placer, también deseo agradecerte el análisis y devolución.

Modifiqué el código tomando nota de tus palabras, estuve unas cuantas horas probando cosas y ha sido mas que productivo.
Tal vez el nuevo código todavía no esté a la altura de las circunstancias, pero creo que lo mejoré bastante y lo mas importante es que aprendí muchísimo haciendolo.

Nuevo esquema de clases:



y el codigo:

Código: [Seleccionar]
import java.util.Calendar;

public class Producto {
    private int numeroLote;
    private Calendar fechaCaducidad;

    public Producto(int numeroLote, Calendar fechaCaducidad) {
        this.numeroLote = numeroLote;
        this.fechaCaducidad = fechaCaducidad;
    }

    public void setNumeroLote(int numeroLote) {
        this.numeroLote = numeroLote;
    }

    public void setFechaCaducidad(int anio, int mes, int dia) {
        fechaCaducidad.set(anio, mes, dia);
    }
   
    public int getNumeroLote() { return numeroLote; }
   
    public Calendar getFechaCaducidad() { return fechaCaducidad; }
   
    public void mostrarProducto() {
        System.out.print("\nNumero de Lote :\t\t"+numeroLote+ "\nFecha de Caducidad :\t\t"
        +fechaCaducidad.getTime().toString());
    }
}


Código: [Seleccionar]
import java.util.Calendar;

public class ProductoRefrigeradoOCongelado extends Producto {
    private Calendar fechaEnvase;
    private String paisOrigen;
   
    public ProductoRefrigeradoOCongelado (int numeroLote, Calendar fechaCaducidad,
                                           Calendar fechaEnvase, String paisOrigen) {
        super(numeroLote, fechaCaducidad);
        this.fechaEnvase = fechaEnvase;
        this.paisOrigen = paisOrigen;
    }

    public void setFechaEnvase (Calendar fechaEnvase) {
        this.fechaEnvase = fechaEnvase;
    }

    public void setPaisOrigen (String paisOrigen) {
        this.paisOrigen = paisOrigen;
    }

    public Calendar getFechaEnvase () { return fechaEnvase; }

    public String getPaisOrigen () { return paisOrigen; }

    public void mostrarProducto() {
        super.mostrarProducto();
        System.out.print("\nFecha de Envase :\t\t"+fechaEnvase.getTime()
                          .toString()+"\nPais de Origen :\t\t"+paisOrigen);
    }

}

Código: [Seleccionar]
import java.util.Calendar;
import java.util.ArrayList;
import java.util.Iterator;

public class ProductoRefrigerado extends ProductoRefrigeradoOCongelado {
    private String codSupervision;
    private static ArrayList<ProductoRefrigerado> lista = new ArrayList<ProductoRefrigerado>();

    public ProductoRefrigerado  (int numeroLote, Calendar fechaCaducidad,
                                  Calendar fechaEnvase, String paisOrigen,
                                  String codSupervision)
    {
        super(numeroLote, fechaCaducidad, fechaEnvase, paisOrigen);
        this.codSupervision = codSupervision;
        lista.add(this);
    }

    public void setCodSupervision(String codSupervision) {
        this.codSupervision = codSupervision;
    }

    public String getCodSupervision() { return codSupervision; }

    public void mostrarProducto() {
        super.mostrarProducto();
        System.out.println("\nCodigo Supervision Alimentaria:\t"+codSupervision);
    }   
   
    public static void mostrarTodosLosProductos() {
        int i = 1;
        Iterator<ProductoRefrigerado> iterador = lista.iterator();
        while (iterador.hasNext()) {
            System.out.println("\nProducto refrigerado "+i++);
            iterador.next().mostrarProducto();
        }
    }
}

Código: [Seleccionar]
import java.util.Calendar;
import java.util.ArrayList;

public class ProductoCongelado extends ProductoRefrigeradoOCongelado {
   
    private String tempMantenimiento;
   
    public ProductoCongelado  (int numeroLote, Calendar fechaCaducidad,
                                Calendar fechaEnvase, String paisOrigen,
                                String tempMantenimiento)
    {
        super(numeroLote, fechaCaducidad, fechaEnvase, paisOrigen);
        this.tempMantenimiento = tempMantenimiento;
    }

    public void setTempMantenimiento(String tempCongelacionRecomendada) {
       this.tempMantenimiento = tempMantenimiento;
    }
   
    public String getTempMantenimiento() { return tempMantenimiento; }
   
    public void mostrarProducto() {
        super.mostrarProducto();
        System.out.print("\nTemperatura de mantenimiento:\t"+getTempMantenimiento());
    }
}

Código: [Seleccionar]
import java.util.Calendar;
import java.util.ArrayList;
import java.util.Iterator;

public class ProductoFresco extends Producto {
    private Calendar fechaEnvase;
    private String paisOrigen;
    private static ArrayList<ProductoFresco> lista = new ArrayList<ProductoFresco>();
   
   
    public ProductoFresco (int numeroLote, Calendar fechaCaducidad,
                            Calendar fechaEnvase, String paisOrigen) {
        super(numeroLote, fechaCaducidad);
        this.fechaEnvase = fechaEnvase;
        this.paisOrigen = paisOrigen;
        lista.add(this);
    }

    public void setFechaEnvase (Calendar fechaEnvase) {
        this.fechaEnvase = fechaEnvase;
    }

    public void setPaisOrigen (String paisOrigen) {
        this.paisOrigen = paisOrigen;
    }

    public Calendar getFechaEnvase () { return fechaEnvase; }

    public String getPaisOrigen () { return paisOrigen; }

    public void mostrarProducto() {
        super.mostrarProducto();
        System.out.println("\nFecha de Envase :\t\t"+fechaEnvase.getTime()
                              .toString()+"\nPais de Origen :\t\t"+paisOrigen);
    }
   
    public static void mostrarTodosLosProductos() {
        int i = 1;
        Iterator<ProductoFresco> iterador = lista.iterator();
        while (iterador.hasNext()) {
            System.out.println("\nProducto fresco "+i++);
            iterador.next().mostrarProducto();
        }
    }
}

Código: [Seleccionar]
import java.util.Calendar;
import java.util.ArrayList;
import java.util.Iterator;

public class ProdCongPorAire extends ProductoCongelado {

    private double porcentajeNitrogeno, porcentajeOxigeno, porcentajeDioxidoCarbono, porcentajeVaporAgua;
    private static ArrayList<ProdCongPorAire> lista = new ArrayList<ProdCongPorAire>();

    public ProdCongPorAire  (int numeroLote, Calendar fechaCaducidad,
                              Calendar fechaEnvase, String paisOrigen,
                              String tempMantenimiento, double porcentajeNitrogeno,
                              double porcentajeOxigeno, double porcentajeDioxidoCarbono,
                              double porcentajeVaporAgua)
    {
        super(numeroLote, fechaCaducidad, fechaEnvase, paisOrigen, tempMantenimiento);
        this.porcentajeNitrogeno = porcentajeNitrogeno;
        this.porcentajeOxigeno = porcentajeOxigeno;
        this.porcentajeDioxidoCarbono = porcentajeDioxidoCarbono;
        this.porcentajeVaporAgua = porcentajeVaporAgua;
        lista.add(this);
    }

    public void getComposicion() {
        System.out.println("Composición aire al congelar:\nPorcentaje Nitrogeno:\t\t"+porcentajeNitrogeno+"\nPorcentaje Oxigeno:\t\t"
        +porcentajeOxigeno+"\nPorcentaje Dioxido de Carbono:\t" +porcentajeDioxidoCarbono+"\nPorcentaje vapor de agua:\t"+porcentajeVaporAgua);
    }

    public void mostrarProducto() {
        super.mostrarProducto();
        System.out.println("\nPorcentaje de Nitrogeno :\t"+porcentajeNitrogeno+"\nPorcentaje de Oxigeno :\t\t"+porcentajeOxigeno
        +"\nPorcentaje de Dioxido de Carbono : "+porcentajeDioxidoCarbono+"\nPorcentaje de Vapor de Agua :\t"
        +porcentajeVaporAgua);
    }
   
    public static void mostrarTodosLosProductos() {
        int i = 1;
        Iterator<ProdCongPorAire> iterador = lista.iterator();
        while (iterador.hasNext()) {
            System.out.println("\nProducto congelado por aire "+i++);
            iterador.next().mostrarProducto();
        }
    }
}

Código: [Seleccionar]
import java.util.Calendar;
import java.util.ArrayList;
import java.util.Iterator;

public class ProdCongPorAgua extends ProductoCongelado {
   
    private double salinidadAgua;
    private static ArrayList<ProdCongPorAgua> lista = new ArrayList<ProdCongPorAgua>();
   
    public ProdCongPorAgua (int numeroLote, Calendar fechaCaducidad,
                            Calendar fechaEnvase, String paisOrigen,
                            String tempMantenimiento, double salinidadAgua)
    {
        super(numeroLote, fechaCaducidad, fechaEnvase, paisOrigen, tempMantenimiento);
        this.salinidadAgua = salinidadAgua;
        lista.add(this);
    }

    public void setSalinidad (double salinidadAgua) {
        this.salinidadAgua = salinidadAgua;
    }
   
    public double getSalinidad () { return salinidadAgua; }
   
    public void mostrarProducto() {
        super.mostrarProducto();
        System.out.println("\nSalinidad del agua:\t\t"+salinidadAgua);
    }
   
        public static void mostrarTodosLosProductos() {
        int i = 1;
        Iterator<ProdCongPorAgua> iterador = lista.iterator();
        while (iterador.hasNext()) {
            System.out.println("\nProducto congelado por agua "+i++);
            iterador.next().mostrarProducto();
        }
    } 
}

Código: [Seleccionar]
import java.util.Calendar;
import java.util.ArrayList;
import java.util.Iterator;

public class ProdCongPorNitrogeno extends ProductoCongelado {
   
    private String metodoCongelacion;
    private int tiempoExposicion;
    private static ArrayList<ProdCongPorNitrogeno> lista = new ArrayList<ProdCongPorNitrogeno>();
   
    public ProdCongPorNitrogeno   (int numeroLote, Calendar fechaCaducidad,
                                    Calendar fechaEnvase, String paisOrigen,
                                    String tempMantenimiento, String metodoCongelacion,
                                    int tiempoExposicion)
    {
        super(numeroLote, fechaCaducidad, fechaEnvase, paisOrigen, tempMantenimiento);
        this.metodoCongelacion = metodoCongelacion;
        this.tiempoExposicion = tiempoExposicion;
        lista.add(this);
    }

    public void setMetodoCongelacion (String metodoCongelacion) {
        this.metodoCongelacion = metodoCongelacion;
    }
   
    public void setTiempoExposicion (int tiempoExposicion) {
        this.tiempoExposicion = tiempoExposicion;
    }
   
    public String getMetodoCongelacion() { return metodoCongelacion; }
   
    public int getTiempoExposicion() { return tiempoExposicion; }
   
    public void mostrarProducto() {
        super.mostrarProducto();
        System.out.println("\nMetodo de congelacion:\t\t"+metodoCongelacion
        +"\nTiempo de exposicion en Nitrogeno: "+tiempoExposicion);
    } 
   
    public static void mostrarTodosLosProductos() {
        int i = 1;
        Iterator<ProdCongPorNitrogeno> iterador = lista.iterator();
        while (iterador.hasNext()) {
            System.out.println("\nProducto congelado por nitrogeno "+i++);
            iterador.next().mostrarProducto();
        }
    } 
   
}

Código: [Seleccionar]
import java.util.Calendar;
import java.util.Scanner;

public class TestHerencia3 {
    public static void main (String[] args) {
        Calendar fechaEnvase = Calendar.getInstance();
        Calendar fechaCaducidad = Calendar.getInstance();
        fechaEnvase.set(2015,9,22);
        fechaCaducidad.set(2016,9,22);
        ProductoFresco producto1 = new ProductoFresco (42, fechaCaducidad,
                fechaEnvase, "Argentina");
        ProductoFresco producto2 = new ProductoFresco (43, fechaCaducidad,
                fechaEnvase, "Argentina");
        ProductoRefrigerado producto3 = new ProductoRefrigerado  (44, fechaCaducidad,
                fechaEnvase, "Argentina", "4258CA");
        ProductoRefrigerado producto4 = new ProductoRefrigerado  (45, fechaCaducidad,
                fechaEnvase, "Uruguay", "4258CB");
        ProductoRefrigerado producto5 = new ProductoRefrigerado  (46, fechaCaducidad,
                fechaEnvase, "Uruguay", "4258KJ");       
        ProdCongPorAire producto6 = new ProdCongPorAire (47, fechaCaducidad,
                fechaEnvase, "Argentina", "-5Cº", 25,25,10,40);
        ProdCongPorAire producto7 = new ProdCongPorAire (48, fechaCaducidad,
                fechaEnvase, "Argentina", "-3Cº", 27,23,12,38);
        ProdCongPorAgua producto8 = new ProdCongPorAgua (49, fechaCaducidad,
                            fechaEnvase, "Chile", "5cº", 4);
        ProdCongPorAgua producto9 = new ProdCongPorAgua (50, fechaCaducidad,
                            fechaEnvase, "Perú", "4cº", 3);
        ProdCongPorNitrogeno producto10 = new ProdCongPorNitrogeno(51, fechaCaducidad,
                                    fechaEnvase, "Bolivia", "3.4Cº", "Criogenico",20);
        System.out.println("Lista de productos: \n");
        System.out.println("Productos Frescos:");
        ProductoFresco.mostrarTodosLosProductos();
        System.out.println("\nProductos Refrigerados:");
        ProductoRefrigerado.mostrarTodosLosProductos();
        pause();
        System.out.println("\nProductos Congelados:");
        ProdCongPorAire.mostrarTodosLosProductos();
        pause();
        ProdCongPorAgua.mostrarTodosLosProductos();
        ProdCongPorNitrogeno.mostrarTodosLosProductos();
    }
    public static void pause() {
        Scanner sc = new Scanner(System.in);
        System.out.println("\nPresione una tecla para continuar...");
        sc.nextLine();
    }   
}

Gracias.

Saludos.

  Adrian
« Última modificación: 26 de Julio 2015, 16:08 por Mario R. Rancel »

Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Hola adrit, me alegro que te hayas animado a mejorar tu código y que te haya resultado útil. Ahora el esquema de clases lo veo correcto y consistente, no contraviene la realidad. Usas una clase intermedia que no existe en la realidad (ProductoRefrigeradoOCongelado) pero sin desvirtuar un diseño correcto.

Los nombres de clases también los veo ahora correctos.

Los valores numéricos que antes definías indebidamente como String están ahora corregidos.

Has incurrido sin embargo en un nuevo error en el diseño, que debes tener en cuenta.

Por ejemplo en la clase ProductoFresco defines lo siguiente:
Código: [Seleccionar]
public class ProductoFresco extends Producto {
    private Calendar fechaEnvase;
    private String paisOrigen;
    private static ArrayList<ProductoFresco> lista = new ArrayList<ProductoFresco>();


¿Por qué no es conforme este diseño a las buenas prácticas de diseño? Porque una clase Java debe representar una única cosa. En este caso, si la clase representa un producto fresco, no tiene sentido que contenga una colección de productos frescos.

En un buen diseño, una clase representa una sola cosa y un método hace una sola cosa.

Si se quiere, se puede tener una clase que represente un producto fresco y otra clase que represente una lista de productos frescos, pero una clase no debe mezclar ambos conceptos.

¿Cómo resolver esto?

Lo más sencillo es eliminar de las clases tipo ProductoFresco toda referencia a listas. La clase representará únicamente lo que dice su nombre.

Luego en el main creamos los productos y los introducimos en una colección de tipo ArrayList. Si te fijas, así es como está resuelto en https://www.aprenderaprogramar.com/foros/index.php?topic=2935

Hay más opciones de diseño, pero creo que esta es la más sencilla para resolver el ejercicio.

Saludos

adrit

  • Principiante
  • **
  • APR2.COM
  • Mensajes: 59
    • Ver Perfil
Hola Mario,

Pongo el codigo de la clase TestHerencia3 solamente.
El resto está igual solo saqué las lineas de ArrayList,

Código: [Seleccionar]
import java.util.Calendar;
import java.util.Scanner;
import java.util.List;
import java.util.ArrayList;

public class TestHerencia3 {
    public static List<Producto> listaProductoFresco = new ArrayList<Producto>();
    public static List<Producto> listaProductoRefrigerado = new ArrayList<Producto>();
    public static List<Producto> listaProdCongPorAire = new ArrayList<Producto>();
    public static List<Producto> listaProdCongPorAgua = new ArrayList<Producto>();
    public static List<Producto> listaProdCongPorNitrogeno = new ArrayList<Producto>();
    public static void main (String[] args) {
        Calendar fechaEnvase = Calendar.getInstance();
        Calendar fechaCaducidad = Calendar.getInstance();
        fechaEnvase.set(2015,9,22);
        fechaCaducidad.set(2016,9,22);
        listaProductoFresco.add(new ProductoFresco (42, fechaCaducidad,
                fechaEnvase, "Argentina"));
        listaProductoFresco.add(new ProductoFresco (43, fechaCaducidad,
                fechaEnvase, "Argentina"));
        listaProductoRefrigerado.add(new ProductoRefrigerado  (44, fechaCaducidad,
                fechaEnvase, "Argentina", "4258CA"));
        listaProductoRefrigerado.add(new ProductoRefrigerado  (45, fechaCaducidad,
                fechaEnvase, "Uruguay", "4258CB"));
        listaProductoRefrigerado.add(new ProductoRefrigerado  (46, fechaCaducidad,
                fechaEnvase, "Uruguay", "4258KJ"));       
        listaProdCongPorAire.add(new ProdCongPorAire (47, fechaCaducidad,
                fechaEnvase, "Argentina", "-5Cº", 25,25,10,40));
        listaProdCongPorAire.add(new ProdCongPorAire (48, fechaCaducidad,
                fechaEnvase, "Argentina", "-3Cº", 27,23,12,38));
        listaProdCongPorAgua.add(new ProdCongPorAgua (49, fechaCaducidad,
                            fechaEnvase, "Chile", "5cº", 4));
        listaProdCongPorAgua.add(new ProdCongPorAgua (50, fechaCaducidad,
                            fechaEnvase, "Perú", "4cº", 3));
        listaProdCongPorNitrogeno.add(new ProdCongPorNitrogeno(51, fechaCaducidad,
                                    fechaEnvase, "Bolivia", "3.4Cº", "Criogenico",20));
        mostrarProductos();
    }
    public static void mostrarProductos() {
        System.out.println("Productos Frescos:");
        for(Producto tmp:listaProductoFresco){
            tmp.mostrarProducto();
        }
        pause();
        System.out.println("\nProductos Refrigerados:");
        for(Producto tmp:listaProductoRefrigerado){
            tmp.mostrarProducto();
        }
        pause();
        System.out.println("\nProductos Congelado por Aire:");
        for(Producto tmp:listaProdCongPorAire){
            tmp.mostrarProducto();
        }
        pause();
        System.out.println("\nProductos Congelado por Agua:");
        for(Producto tmp:listaProdCongPorAgua){
            tmp.mostrarProducto();
        }
        pause();
        System.out.println("\nProductos Congelado por Nitrogeno:");
        for(Producto tmp:listaProdCongPorNitrogeno){
            tmp.mostrarProducto();
        }
    }   
    public static void pause(){
        Scanner sc = new Scanner(System.in);
        System.out.println("\nPresione una tecla para continuar..");
        sc.nextLine();
    }
}

Antes de finalizar tengo una consulta:

Pensé que un campo de clase era útil en estos casos para usarlo de la manera que lo hice en la segunda versión del código.
Ahora sabemos que eso es un error y me gustaría saber que uso se le puede dar a  un campo estático o de clase?

Gracias,

Saludos!



Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Hola, a la vista de tu código veo que has creado distintas listas para los distintos tipos de productos. Es una opción de diseño. Otra opción hubiera sido crear una sola lista y tener en ellos los diferentes tipos de productos. Esto es posible gracias al polimorfismo de Java. Es decir podríamos escribir List<Producto> listaProductos = new ArrayList<Producto>(); y dentro de esa lista tener tanto productos frescos como refrigerados, congelados, etc. Esto es posible gracias a que Java admite en la lista cualquier cosa que sea de tipo Producto, y los distintos tipos de productos son a la vez de dos tipos: el tipo estático Producto y el tipo dinámico (por ejemplo ProductoFresco).

Un campo de clase o static representa algo que es común para todos los objetos y que por tanto no es algo distinguible en cada objeto, sino algo común a todos ellos.

Recomendaría releer http://aprenderaprogramar.com/index.php?option=com_content&view=article&id=639:static-final-en-java-palabras-clave-variables-de-clase-o-campos-estaticos-y-constantes-ejemplos-cu00673b&catid=68:curso-aprender-programacion-java-desde-cero&Itemid=188

A veces un campo podría ser static y sin embargo no se hace static, esto depende del programador y de la forma de diseño y de trabajo a la que esté acostumbrado. Por ello no hay una regla exacta. Voy a poner un ejemplo: supón que estás desarrollando un videojuego donde una entidad es un "Bloque". Supón que cada bloque se construye siempre a partir de 4 unidades elementales a las que denominamos ladrillos. En esa situación en la clase bloque podríamos escribir static int numeroDeLadrillos = 4;

Esto significaría que todos los bloques tienen 4 ladrillos. Al ser algo común a todos los bloques, sólo existe una vez, y por tanto no tendría método set (ya que set permitiría establecer el número de ladrillos para cada bloque, pero en este caso estamos diciendo que es algo común para todos los bloques).

Puedes plantearte cualquier situación y buscar ejemplos, aunque también es cierto que al principio no es fácil distinguir cómo debemos hacer los diseños como programadores. Para ir adquiriendo soltura con esto conviene ir estudiando, analizando código que crean otras personas y viendo cómo lo hacen, tomando ideas (buenas ideas) de libros o de internet, etc. Y a medida que pase el tiempo y se vaya programando se adquirirá soltura a la hora de realizar diseños de código, no es algo que se pueda estudiar y hacer bien a la primera.

Saludos

adrit

  • Principiante
  • **
  • APR2.COM
  • Mensajes: 59
    • Ver Perfil
Hola Mario,

Quiero comentar que las distintas listas las he realizado porque no encontré manera de distinguir los tipos si los mezclaba en una misma lista.
Mi idea era especificar cada tipo al momento de listarlos.
No quise usar la función instanceof para hacer caso a la recomendación que me has dado en cuanto a no adelantarme a los capítulos siguientes.

Gracias por dedicar valioso tiempo para responder cada una de mis consultas.

Saludos!

 

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".