Autor Tema: Concepto: polimorfismo, variables polimórficas. Ejercicio Java CU00688B resuelto  (Leído 4254 veces)

adrit

  • Principiante
  • **
  • APR2.COM
  • Mensajes: 59
    • Ver Perfil
¿Hola cómo estan?

Dejo mi código para el ejercicio CU00688B (descargar archivo adjunto estando logeados en el foro).

Citar
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 aire 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.

Gracias, un abrazo a todos!

Adrian
« Última modificación: 31 de Julio 2015, 11:17 por Alex Rodríguez »

RaGa

  • Moderador Global
  • Intermedio
  • *******
  • APR2.COM
  • Mensajes: 234
    • Ver Perfil
Hola Adrián:

Estuve revisando tu ejercicio. Lo veo bien pero creo que habría que hacer algunos cambios.

Respecto de la clase TestHerencia4: no creo que la lista ArrayList<Producto> deba ser un atributo del método main.
Pienso que el método main deberia tener como atributo un objeto tipo EnvioDeProducto que corresponderá a un pedido realizado por un cliente determinado.

Respecto de la clase EnvioDeProducto:
Creo que la lista ArrayList<Producto> debería ser su campo de instancia.
De esta manera (la lista como campo de instancia de la clase EnvioDeProducto), podrás crear en un futuro tantos objetos EnvioDeProducto como pedidos hagan los clientes. Cada objeto EnvioDeProducto corresponderá a un pedido realizado.

Si un cliente solicita un envio a domicilio, crearíamos un objeto tipo EnvioDeProducto el cual contendría todos los productos que solicite.
Si un segundo cliente nos hace un encargo de productos para su restaurante, creamos otro objeto tipo EnvioDeProducto conteniendo todos los productos que le son indispensables para su restaurante.

En la clase EnvioDeProducto tendría un método para agregar productos a la lista y otro método que me muestre la lista completa (a través de un iterador).

Pero es conceptualmente importante pensar que el objeto EnvioDeProducto posea una lista de los productos elegidos, y sus métodos.
De la manera en que lo pensaste tu, la lista es solo un atributo del método main de la clase Herencia4.

Respecto de la organización de las clases: está muy bien, pero creo que podría ser aún más eficiente y poner en práctica los conceptos de herencia.
Fíjate que todos los productos, tienen los campos comunes: fecha de caducidad y nro. de lote, como bien los definiste tu en la clase Producto.
Sin embargo, podemos notar que los campos: fecha de envasado y pais de origen, también son comunes a TODOS los productos, tanto de los productos frescos, como de los productos refrigerados, como de los productos congelados.
Entonces, en vez de definir esos campos en cada clase, sería mejor definirlos en la clase Producto directamente.
Deberíamos por lo tanto agrupar todos los campos comunes en las clases padres y luego que las clases hijas vayan declarando los campos que no sean comunes.

De esta manera el esquema que definiste se mantedría igual, solamente cambiarían los campos que cada clase declara.

Clase Producto: fecha de caducidad, nro. de lote, fecha de envasado, pais de origen.
Clase ProductoRefrigeradoOCongelado: temperatura de mantenimiento recomendada.
Clase ProductoFresco: no declara nuevos campos (son los mismos campos de la clase padre Producto).
Clase ProductoRefrigerado: codigo OSA.
Clase ProductoCongelado no declara nuevos campos (son los mismos campos de la clase padre ProductoRefrigeradoOCongelado).
Clase ProdCongPorAgua: salinidad.
Clase ProdCongPorAire: porcentaje de Ni, porcentaje de O2, porcentaje de CO2, porcentaje de vapor de agua.
Clase ProdCongPorNitrogeno: tiempo de exposicion, y metodo empleado.

Respecto de la clase Clase ProdCongPorAire:
Fíjate que declaras 4 campos de instancia, por tanto deberás tener 4 métodos set y 4 métodos get en la clase. Y los métodos get deben simplemente retornar el valor, no sacarlos por consola.
Para sacar por consola todos los valores de los campos que posee la clase con sus respectivas leyendas está el método mostrarProducto().

adrit

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

Hice modificaciones para corregir los problemas mencionados.

Gracias!

RaGa

  • Moderador Global
  • Intermedio
  • *******
  • APR2.COM
  • Mensajes: 234
    • Ver Perfil
Hola Adrián:

Analizando las correcciones que realizaste noto que has reagrupado los atributos comunes en las clases padres, eso lo veo bien.

Lo que no veo bien es que eliminaste la clase intermedia ProductoRefrigeradoOCongelado que era un gran acierto. Te había indicado:

Citar
De esta manera el esquema que definiste se mantedría igual, solamente cambiarían los campos que cada clase declara.

Fíjate que en el post anterior también te había sugerido que la clase ProductoRefrigeradoOCongelado declarara un solo campo de instancia: temperatura de mantenimiento recomendada (atributo común tanto a los productos congelados como a los productos refrigerados).

Respecto de la nueva clase ProductoFresco: sería aún más corta de lo que codificaste ¿por qué? porque debido a la herencia no hace falta volver a declarar los métodos que hereda de la clase Producto. Recuerda que ProductoFresco heredará todos los campos de instancia y los métodos de la clase padre Producto.
Los objetos tipo ProductoFresco unicamente necesitarán los campos y métodos heredados.

Por tanto esta nueva clase será:

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

public class ProductoFresco extends Producto {
   
    public ProductoFresco (int numeroLote, Calendar fechaCaducidad,
                            Calendar fechaEnvase, String paisOrigen) {
        super(numeroLote, fechaCaducidad, fechaEnvase, paisOrigen);
    }

}

Respecto de la clase ProdCongPorAire: definiste bien los métodos set para cada campo de instancia, pero no veo bien el método getComposicion(). Dejaría la salida por consola solo en el método mostrarProducto().
Definiría un método get para cada campo de instancia, de la misma manera que lo hiciste con los métodos set.

Muy bien la clase EnvioDeProductos a la que hemos dedicado un párrafo anteriormente, y muy bien tambien las restantes clases.

Saludos.

adrit

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

Gracias por la devolución. Hice nuevas modificaciones siguiendo las instrucciones dadas.

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