Autor Tema: Java agrupar objetos de distintos tipos en una colección polimorfismo CU00688B#  (Leído 9563 veces)

pedro,,

  • Moderador Global
  • Experto
  • *******
  • APR2.COM
  • Mensajes: 1292
    • Ver Perfil
El ejercicio pedía lo siguiente:

EJERCICIO

Amplía el código del programa Java que planteamos como ejercicio en la entrega CU00687 de este curso, relativo a la gestión de una empresa agroalimentaria, teniendo en cuenta que la empresa gestiona envíos a través de diferentes medios, y un envío puede contener cierto número de productos frescos, refrigerados o congelados. Añade al código:

a) Una clase EnvioDeProductos que represente un envío de productos como colección de objetos que admite el polimorfismo.

b) Crear una clase testHerencia4 con el método main donde se creen: dos productos frescos, tres productos refrigerados y cinco productos congelados (2 de ellos congelados por agua, otros 2 por agua y 1 por nitrógeno). Crear un envío que represente la agrupación de los anteriores productos. Mostrar por pantalla la información del número de productos que componen el envío y recorrer los productos del envío usando iterator para mostrar la información (valor de los atributos) de cada uno de ellos.


y estas son las clases que creé para conseguir la resolución del ejercicio.


Clase Producto

Código: [Seleccionar]
public class Producto {
   
    private String fechaCaducidad;
    private int numLote;
   
    public Producto(){
        fechaCaducidad = "";
        numLote=0;
    }
    public Producto(String fechaCaducidad, int numLote){
        this.fechaCaducidad = fechaCaducidad;
        this.numLote = numLote;
    }
    public void setFechaCaducidad(String fechaCaducidad){ this.fechaCaducidad = fechaCaducidad;}
    public void setNumLote(int numLote){ this.numLote = numLote; }
    public String getFechaCaducidad() { return fechaCaducidad; }
    public int getNumLote() { return numLote; }
    public void muestraDatosProducto(){
        System.out.println("Número de lote " + getNumLote());
        System.out.println("Fecha de caducidad: " + getFechaCaducidad());
    }

}


Clase ProductoRefrigerado

Código: [Seleccionar]
public class ProductoRefrigerado extends Producto{

    private int codigoOSA; // código Organismo de Supervisión Alimentaria
    public ProductoRefrigerado() {
        super();
        codigoOSA = 0;   
    }
    public ProductoRefrigerado (String fechaCaducidad, int numLote, int codigoOSA) {
        super(fechaCaducidad, numLote);
        this.codigoOSA = codigoOSA;
    }
    public void setCodigoOSA(int codigoOSA) { this.codigoOSA = codigoOSA; }
    public int getCodigoOSA() { return codigoOSA; }
    public void muestraDatosProducto(){
        System.out.println("Producto Refrigerado");
        super.muestraDatosProducto();
        System.out.println("Código de supervisión alimentaria: " + getCodigoOSA());
    }
   
   
}


Clase ProductoFresco

Código: [Seleccionar]
public class ProductoFresco extends Producto {
   
    private String fechaEnvasado;
    private String paisOrigen;
   
    public ProductoFresco() {
        super();
        fechaEnvasado = "";
        paisOrigen = "";       
    }
    public ProductoFresco (String fechaCaducidad, int numLote, String fechaEnvasado, String paisOrigen) {
        super(fechaCaducidad, numLote);
        this.fechaEnvasado = fechaEnvasado;
        this.paisOrigen = paisOrigen;
    }
   
    public void setFechaEnvasado(String fechaEnvasado) { this.fechaEnvasado = fechaEnvasado; }
    public void setPaisOrigen(String paisOrigen) { this.paisOrigen =paisOrigen; }
    public String getFechaEnvasado() { return fechaEnvasado; }
    public String getPaisOrigen() { return paisOrigen; }
    public void muestraDatosProducto() {
        System.out.println("Producto Fresco");
        super.muestraDatosProducto();
        System.out.println("Fecha de envasado: " + getFechaEnvasado());
        System.out.println("Pais de origen: " + getPaisOrigen());
       
    }
}


Clase ProductoCongelado

Código: [Seleccionar]
public class ProductoCongelado extends Producto{
   
    private double tempCongelacionRecomendada; // Temperatura Congelacion Recomendada.
   
    public ProductoCongelado(){
        super();
        tempCongelacionRecomendada = 0;
    }
    public ProductoCongelado(String fechaCaducidad, int numLote, double tempCongelacionRecomendada){
        super(fechaCaducidad, numLote);
        this.tempCongelacionRecomendada = tempCongelacionRecomendada;
    }
   
    public void setTempCongReco(double tempCongelacionRecomendada){ this.tempCongelacionRecomendada = tempCongelacionRecomendada; }
    public double getTempCongReco(){ return tempCongelacionRecomendada; }
    public void muestraDatosProducto(){
        super.muestraDatosProducto();
        System.out.println("Temperatura de congelación recomendada: " + getTempCongReco() + " ºC ");
    }   
}


Clase CongeladoPorAgua

Código: [Seleccionar]
public class CongeladoPorAgua extends ProductoCongelado{
   
    private double salinidadAgua;
    public CongeladoPorAgua(){
        super();
        salinidadAgua = 0;
    }
    public CongeladoPorAgua(String fechaCaducidad, int numLote, double tempCongelacionRecomendada, double salinidadAgua){
        super(fechaCaducidad, numLote, tempCongelacionRecomendada);
        this.salinidadAgua = salinidadAgua;
    }
    public void setSalinidadAgua(double salinidadAgua){ this.salinidadAgua = salinidadAgua; }
    public double getSalinidadAgua(){ return salinidadAgua; }
    public void muestraDatosProducto(){
        System.out.println("Producto Congelado por Agua");
        super.muestraDatosProducto();
        System.out.println("Salinidad: " + getSalinidadAgua() + " gramos de sal por litro de agua.");
    }
}


Clase CongeladoPorAire

Código: [Seleccionar]
public class CongeladoPorAire extends ProductoCongelado{
   
    private double porcentajeNitrogeno;
    private double porcentajeOxigeno;
    private double porcentajeDioxidoCarbono;
    private double porcentajeVaporAgua;
    public CongeladoPorAire(){
        super();
        porcentajeNitrogeno = 0;
        porcentajeOxigeno = 0;
        porcentajeDioxidoCarbono = 0;
        porcentajeVaporAgua = 0;
    }
    public CongeladoPorAire(String fechaCaducidad, int numLote, double tempCongelacionRecomendada, double porcentajeNitrogeno, double porcentajeOxigeno, double porcentajeDioxidoCarbono, double porcentajeVaporAgua){
        super(fechaCaducidad, numLote, tempCongelacionRecomendada);
        this.porcentajeNitrogeno = porcentajeNitrogeno;
        this.porcentajeOxigeno = porcentajeOxigeno;
        this.porcentajeDioxidoCarbono = porcentajeDioxidoCarbono;
        this.porcentajeVaporAgua = porcentajeVaporAgua;
    }
    public void setPorcentajeNitrogeno(double porcentajeNitrogeno){ this.porcentajeNitrogeno = porcentajeNitrogeno; }
    public void setPorcentajeOxigeno(double porcentajeOxigeno){ this.porcentajeOxigeno = porcentajeOxigeno; }
    public void setPorcentajeDioxidoCarbono(double porcentajeDioxidoCarbono){ this.porcentajeDioxidoCarbono = porcentajeDioxidoCarbono; }
    public void setPorcentajeVaporAgua(double porcentajeVaporAgua){ this.porcentajeVaporAgua = porcentajeVaporAgua; }
    public double getPorcentajeNitrogeno(){ return porcentajeNitrogeno; }
    public double getPorcentajeOxigeno(){ return porcentajeOxigeno; }
    public double getPorcentajeDioxidoCarbono(){ return porcentajeDioxidoCarbono; }
    public double getPorcentajeVaporAgua(){ return porcentajeVaporAgua; }
    public void muestraDatosProducto(){
        System.out.println("Producto Congelado por Aire");
        super.muestraDatosProducto();
        System.out.print("Composición del aire del: " );
        System.out.print(getPorcentajeNitrogeno() + "% de nitrogeno, " + getPorcentajeOxigeno() + "% de Oxigeno, ");
        System.out.println(getPorcentajeDioxidoCarbono() + "% de Dioxido de Carbono, " + getPorcentajeVaporAgua() + "% de vapor de agua.");
    }
}


Clase CongeladoPorNitrogeno

Código: [Seleccionar]
public class CongeladoPorNitrogeno extends ProductoCongelado{
    private String medotoCongelacion;
    private int tiempoExposicionAlNitrogeno;
    public CongeladoPorNitrogeno(){
        super();
        medotoCongelacion = "Unknown";
        tiempoExposicionAlNitrogeno = 0;
    }
    public CongeladoPorNitrogeno(String fechaCaducidad, int numLote, double tempCongelacionRecomendada, String metodoCongelacion, int tiempoExposicionAlNitrogeno){
        super(fechaCaducidad, numLote, tempCongelacionRecomendada);
        this.medotoCongelacion = medotoCongelacion;
        this.tiempoExposicionAlNitrogeno = tiempoExposicionAlNitrogeno;
    }
    public void setMedotoCongelacion(String medotoCongelacion){ this.medotoCongelacion = medotoCongelacion; }
    public void setTiempoExposicionAlNitrogeno(int tiempoExposicionAlNitrogeno){ this.tiempoExposicionAlNitrogeno = tiempoExposicionAlNitrogeno; }
    public String getMetodoCongelacion(){ return medotoCongelacion; }
    public int getTiempoExposicionAlNitrogeno(){ return tiempoExposicionAlNitrogeno; }
    public void muestraDatosProducto(){
        System.out.println("Producto Congelado con nitrogeno");
        super.muestraDatosProducto();
        System.out.println("Método de congelación: " + getMetodoCongelacion());
        System.out.println("Exposición al nitrogeno de: " + getTiempoExposicionAlNitrogeno() + " segundos.");
    }
}


Clase EnvioDeProductos

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

public class EnvioDeProductos {
    ArrayList <Producto> listaDeEnvioDeProductos;

    public EnvioDeProductos () {
        listaDeEnvioDeProductos = new ArrayList <Producto> ();
    }

    public void addProducto (Producto valorProducto) {
        listaDeEnvioDeProductos.add (valorProducto);
    }

    public int getNumeroDeProductosEnEnvio () {
        return listaDeEnvioDeProductos.size();
    }

    public void muestraDatosEnvioProductos() {
        Iterator <Producto> it = listaDeEnvioDeProductos.iterator();
        while(it.hasNext()){
            Producto dato = it.next();
            dato.muestraDatosProducto();
            System.out.println ("------------------------");
        }
    }
}


Clase TestHerencia4

Código: [Seleccionar]
public class TestHerencia4 {
    public static void main (String [] args){
        Producto productoFresco1 = new ProductoFresco("20/12/2020", 456789, "21/08/2015", "España");
        Producto productoFresco2 = new ProductoFresco("2/11/2018", 79354, "17/08/2015", "Francia");
        Producto productoRefrigerado1 = new ProductoRefrigerado("15/04/2017", 48688, 14423557);
        Producto productoRefrigerado2 = new ProductoRefrigerado("11/04/2018", 77889, 44887792);
        Producto productoRefrigerado3 = new ProductoRefrigerado("1/01/2021", 45679, 9787546);
        Producto productoCongeladoPorAire1 = new CongeladoPorAire("07/08/2033", 486578, -18.3, 25, 25, 25, 25);
        Producto productoCongeladoPorAire2 = new CongeladoPorAire("17/11/2023", 485878, -19.0, 35, 15, 20, 30);
        Producto productoCongeladoPorAgua1 = new CongeladoPorAgua("30/12/2018", 68759, -17.7, 33.87);
        Producto productoCongeladoPorAgua2 = new CongeladoPorAgua("15/02/2016", 78956, -17.5, 44.87);
        Producto productoCongeladoPorNitrogeno1 = new CongeladoPorNitrogeno("2/11/2018", 793548, -16.8, "XR-9", 7895);
        EnvioDeProductos lista1 = new EnvioDeProductos();
        lista1.addProducto(productoFresco1);
        lista1.addProducto(productoFresco2);
        lista1.addProducto(productoRefrigerado1);
        lista1.addProducto(productoRefrigerado2);
        lista1.addProducto(productoRefrigerado3);
        lista1.addProducto(productoCongeladoPorAire1);
        lista1.addProducto(productoCongeladoPorAire2);
        lista1.addProducto(productoCongeladoPorAgua1);
        lista1.addProducto(productoCongeladoPorAgua2);
        lista1.addProducto(productoCongeladoPorNitrogeno1);
        System.out.println("El pedido esta formado por " + lista1.getNumeroDeProductosEnEnvio() + " productos.\n");
        lista1.muestraDatosEnvioProductos();
    }

}
« Última modificación: 08 de Agosto 2015, 19:15 por Alex Rodríguez »

Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Hola pedro, he revisado el código y está todo correcto y bien presentado por pantalla.

El método public void muestraDatosProducto() podríamos decir que es mejorable en varios sentidos, pero esto se estudiará en la entrega CU00694B donde se explica el método toString, que vendría a sustituir al método comentado, y cuyo uso implica un cambio de planteamiento: en lugar de incluir las instrucciones para mostrar de pantalla dentro del método hacemos que el método devuelva un String que será manejado posteriormente para mostrar los datos por pantalla desde otro lugar. Pero dado que se explica más adelante no te detengas en esto ahora, es preferible seguir avanzando conforme a la planificación del curso.

Saludos.

pedro,,

  • Moderador Global
  • Experto
  • *******
  • APR2.COM
  • Mensajes: 1292
    • Ver Perfil
Estoy ahora en ese tema del curso, y tienes razón, sabiendo lo que se ahora no hubiese resulto de la misma forma. Una vez más, gracias.
« Última modificación: 13 de Agosto 2019, 19:24 por Ogramar »

Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Sí, pero el aprendizaje tiene que ser gradual... un curso donde se pretendiera hacer las cosas perfectas y con los mejores diseños desde el primer momento no sería un buen curso  ;).

Saludos

diego_godie

  • Sin experiencia
  • *
  • Mensajes: 9
  • Deseo Vivir de esto
    • Ver Perfil
Buenos días, solo quería hacer una observación o consulta. El compañero Pedro creo la clase "EnvioDeProductos", en la cual crea el método para listar o visualizar los productos que integran el envío. En este método que se llama "muestraDatosEnvioProductos":
Código: [Seleccionar]
public void muestraDatosEnvioProductos() {
        Iterator <Producto> it = listaDeEnvioDeProductos.iterator();
        while(it.hasNext()){
            Producto dato = it.next();
            dato.muestraDatosProducto();
            System.out.println ("------------------------");
        }
El utiliza la variable "dato" en la que pone el objeto que nos devuelve next. Me parece que a cada vuelta de ciclo esta declarando la variable. Yo lo resolví de la siguiente manera:
Código: [Seleccionar]
public void listarProductosEnvio(){
        Iterator<Producto> it = productosAEnviar.iterator();
        Producto tmp; //revisar esta variable temporal
        while(it.hasNext()){
            tmp = it.next();
            tmp.mostrar_Info();
            System.out.println("--------------------");
        }
    }

Yo declare una variable temporal "tmp" antes del ciclo while, me parece que así no desperdicio recursos, quizás estoy equivocado.
Quisiera saber si es mas optimo hacerlo de la manera que yo lo hice o la que lo hizo Pedro.

Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Hola Diego, efectivamente es como indicas. Declarando el objeto de tipo Producto fuera del bucle, evitamos el consumo de recursos que supone estar creando el objeto en cada iteración del bucle.

Por tanto tu planteamiento supone una mejora en la eficiencia del código. En ocasiones estos detalles no tienen importancia, pero en otras ocasiones sí que lo tienen. Además ser capaz de valorar estas cuestiones es interesante pues demuestra que se están entendiendo bien los conceptos de programación.

Gracias por la aportación. Saludos cordiales,

diego_godie

  • Sin experiencia
  • *
  • Mensajes: 9
  • Deseo Vivir de esto
    • Ver Perfil
 Muchas gracias por la respuesta, me es de ánimo para mi avance saber que algo vamos aprendiendo y más aun sacarme la duda. Saludos cordiales.
« Última modificación: 13 de Abril 2022, 18:51 por Alex Rodríguez »

 

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