Autor Tema: Java herencia solución ejercicio polimorfismo y variables polimórficas CU00688B  (Leído 2210 veces)

dferna

  • Sin experiencia
  • *
  • Mensajes: 25
    • Ver Perfil
Hola  :D

Expongo la resolución al ejercicio de polimorfismo, ejercicio que amplia el ejercicio de la entrega CU00687B sobre herencia del curso elemental de programación Java con IDE BlueJ


Clase EnvioDeProductos que contiene la lista de productos

Código: [Seleccionar]
package aplicacion;

import java.util.List;
import java.util.ArrayList;

/**
 * Clase EnvioDeProductos que contiene la lista de productos
 * @author David
 *
 */
public class EnvioDeProductos {

private List<Producto> listaProductos;

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

//Getters and Setters
public List<Producto> getListaProductos() {
return listaProductos;
}

public void setListaProductos(List<Producto> listaProductos) {
this.listaProductos = listaProductos;
}

//Método encargado de añadir los productos a la lista para su posterior envio
public ArrayList<Producto> crearEnvio(Producto producto){
listaProductos.add(producto);
return (ArrayList<Producto>) listaProductos;
}
}


Clase TestHerencia4

Código: [Seleccionar]
package test;

import aplicacion.*;
import java.util.Iterator;

public class TestHerencia4 {

public static void main(String[] args){

//Instancio un objeto de la clase EnvioDeProducto
EnvioDeProductos envioProductos = new EnvioDeProductos();

//Creo una lista con todos los productos para su posterior envio
envioProductos.crearEnvio(new ProductoFresco("23/12/2017", 200, "12/03/2017", "EEUU"));
envioProductos.crearEnvio(new ProductoFresco("12/10/2017", 150, "24/06/2017", "Brasil"));
envioProductos.crearEnvio(new ProductoRefrigerado("20/11/2018", 456, "22/02/2017", "España", 22, 32));
envioProductos.crearEnvio(new ProductoRefrigerado("14/09/2019", 303, "18/09/2018", "Alemania", 14, 50));
envioProductos.crearEnvio(new ProductoRefrigerado("05/07/2020", 105, "16/06/2018", "Francia", 48, 85));
envioProductos.crearEnvio(new ProductoCongelado("11/09/2022", 184, "04/05/2017", "China", -30));
envioProductos.crearEnvio(new ProductoCongelado("15/05/2025", 208, "04/05/2017", "Mexico", -28));
envioProductos.crearEnvio(new ProductoCongelado("20/04/2024", 302, "04/05/2017", "Ecuador", -29));
envioProductos.crearEnvio(new ProductoCongelado("30/03/2023", 650, "04/05/2017", "Tailandia", -27));
envioProductos.crearEnvio(new ProductoCongelado("26/01/2021", 985, "04/05/2017", "India", -26));
envioProductos.crearEnvio(new CongeladoAgua("13/06/2020", 656, "31/04/2017", "Portugal", -25, 4));
envioProductos.crearEnvio(new CongeladoAgua("24/08/2024", 987, "06/09/2017", "Italia", -26, 8));
envioProductos.crearEnvio(new CongeladoAire("25/08/2022", 854, "14/11/2017", "Puerto Rico", -30, "4"));
envioProductos.crearEnvio(new CongeladoAire("15/12/2023", 854, "10/08/2017", "Egipto", -28, "3"));
envioProductos.crearEnvio(new CongeladoNitrogeno("25/04/2026", 741, "05/04/2017", "Guatemala", -35, "info", 50));

//Muestro por pantalla la información del número de productos que componen el envio
System.out.println("El número de productos que componen el envio es: "+envioProductos.getListaProductos().size());

//Recorro la lista para ir mostrando la información (valor de los atributos) de cada uno de ellos.
Iterator<Producto> it = envioProductos.getListaProductos().iterator();
Producto elemento;
while (it.hasNext()) {
elemento = it.next();
System.out.println("Este es la información de cada producto: "+elemento.toString());
}
}

}


Superclase Producto

Código: [Seleccionar]
package aplicacion;

/**
 * Superclase Producto
 * @author David
 *
 */
public class Producto {

private String fechaCaducidad;
private int numeroLote;

public Producto(){

}

//Constructor sobrecargado
public Producto(String fechaCaducidad,int numeroLote){
this.fechaCaducidad = fechaCaducidad;
this.numeroLote = numeroLote;
}

//Getters and Setters
public String getFechaCaducidad(){
return fechaCaducidad;
}

public void setFechaCaducidad(String valorFechaCaducidad){
fechaCaducidad = valorFechaCaducidad;
}

public int getNumeroLote(){
return numeroLote;
}

public void setNumeroLote(int valorNumeroLote){
numeroLote = valorNumeroLote;
}

//Método toString sobrecargado
public String toString(){
return "Fecha de caducidad: "+fechaCaducidad+" //Número de lote: "+numeroLote;
}
}


Subclase ProductoFresco que implementa la superclase Producto

Código: [Seleccionar]
package aplicacion;

/**
 * Subclase ProductoFresco que extiende de Producto
 * @author David
 *
 */
public class ProductoFresco extends Producto{

private String fechaEnvasado;
private String paisOrigen;

//Constructor sobrecargado
public ProductoFresco(String fechaCaducidad, int numeroLote, String fechaEnvasado, String paisOrigen){
super(fechaCaducidad,numeroLote);
this.fechaEnvasado = fechaEnvasado;
this.paisOrigen = paisOrigen;
}

//Getters and Setters
public String getFechaEnvasado() {
return fechaEnvasado;
}

public void setFechaEnvasado(String fechaEnvasado) {
this.fechaEnvasado = fechaEnvasado;
}

public String getPaisOrigen() {
return paisOrigen;
}

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

//Método toString sobrecargado
public String toString(){
return "Fecha de caducidad: "+getFechaCaducidad()+" //Número de lote: "+getNumeroLote()+" //Fecha de envasado: "+fechaEnvasado+" País origen: "+paisOrigen;
}
}


Subclase ProductoRefrigerado que implementa la superclase Producto

Código: [Seleccionar]
package aplicacion;

/**
 * Subclase ProductoRefrigerado que extiende de la clase ProductoFresco
 * @author David
 *
 */
public class ProductoRefrigerado extends ProductoFresco {

private int codigoOrganismo;
private double temperaturaMantenimiento;

//Constructor sobrecargado
public ProductoRefrigerado(String fechaCaducidad, int numeroLote, String fechaEnvasado, String paisOrigen,int temperaturaMantenimiento,int codigoOrganismo){
super(fechaCaducidad, numeroLote,fechaEnvasado,paisOrigen);
this.codigoOrganismo = codigoOrganismo;
this.temperaturaMantenimiento = temperaturaMantenimiento;
}

//Getters and Setters
public int getCodigoOrganismo() {
return codigoOrganismo;
}

public void setCodigoOrganismo(int codigoOrganismo) {
this.codigoOrganismo = codigoOrganismo;
}

public double getTemperaturaMantenimiento() {
return temperaturaMantenimiento;
}

public void setTemperaturaMantenimiento(double temperaturaMantenimiento) {
this.temperaturaMantenimiento = temperaturaMantenimiento;
}

//Método toString sobrecargado
public String toString(){
return "Fecha de envasado: "+getFechaEnvasado()+" //Pais de origen: "+getPaisOrigen()+" //Fecha de caducidad: "+getFechaCaducidad()+" //Número de lote: "+getNumeroLote()+" //Temperatura de mantenimiento: "+temperaturaMantenimiento+" //Código organimo: "+codigoOrganismo;
}
}


Superclase ProductoCongelado que a su vez extiende de Producto

Código: [Seleccionar]
package aplicacion;

/**
 * Subclase ProductoCongelado que extiende de ProductoFresco
 * @author David
 *
 */
public class ProductoCongelado extends ProductoFresco {

private int temperaturaMantenimiento;

//Constructor sobrecargado
public ProductoCongelado(String fechaCaducidad, int numeroLote, String fechaEnvasado, String paisOrigen,int temperaturaMantenimiento){
super(fechaCaducidad,numeroLote,fechaEnvasado,paisOrigen);
this.temperaturaMantenimiento = temperaturaMantenimiento;
}

//Getters and Setters
public int getTemperaturaMantenimiento() {
return temperaturaMantenimiento;
}

public void setTemperaturaMantenimiento(int temperaturaMantenimiento) {
this.temperaturaMantenimiento = temperaturaMantenimiento;
}

//Método toString sobrecargado
public String toString(){
return "Fecha de envasado: "+getFechaEnvasado()+" //Pais de origen: "+getPaisOrigen()+" //Fecha de caducidad: "+getFechaCaducidad()+" //Número de lote: "+getNumeroLote()+" //Temperatura de mantenimiento: "+temperaturaMantenimiento;
}
}


Subclase CongeladoAire que extiende de ProductoCongelado

Código: [Seleccionar]
package aplicacion;

/**
 * Subclase CongeladoAire que extiende de ProductoCongelado
 * @author David
 *
 */
public class CongeladoAire extends ProductoCongelado{

private String composicionAire;

//Constructor sobrecargado
public CongeladoAire(String fechaCaducidad, int numeroLote, String fechaEnvasado, String paisOrigen,int temperaturaMantenimiento,String composicionAire){
super(fechaCaducidad,numeroLote,fechaEnvasado,paisOrigen,temperaturaMantenimiento);
this.composicionAire = composicionAire;
}

//Getters and Setters
public String getComposicionAire() {
return composicionAire;
}

public void setComposicionAire(String composicionAire) {
this.composicionAire = composicionAire;
}

//Método toString sobrecargado
public String toString(){
return "Fecha de caducidad: "+getFechaCaducidad()+" //Número de lote: "+getNumeroLote()+" //Fecha envasado: "+getFechaEnvasado()+" //País origen: "+getPaisOrigen()+" //Temperatura mantenimiento: "+getTemperaturaMantenimiento()+" //Composición del aire: "+composicionAire;
}
}


Subclase CongeladoAgua que extiende de ProductoCongelado

Código: [Seleccionar]
package aplicacion;
/**
 * Subclase CongeladoAgua que extiende de ProductoCongelado
 * @author David
 *
 */
public class CongeladoAgua extends ProductoCongelado{

private int salinidadAgua;

//Constructor sobrecargado
public CongeladoAgua(String fechaCaducidad, int numeroLote, String fechaEnvasado, String paisOrigen,int temperaturaMantenimiento,int salinidadAgua){
super(fechaCaducidad,numeroLote,fechaEnvasado,paisOrigen,temperaturaMantenimiento);
this.salinidadAgua = salinidadAgua;
}

//Getters and Setters
public int getSalinidadAgua() {
return salinidadAgua;
}

public void setSalinidadAgua(int salinidadAgua) {
this.salinidadAgua = salinidadAgua;
}

//Método toString sobrecargado
public String toString(){
return "Fecha de caducidad: "+getFechaCaducidad()+" //Número de lote: "+getNumeroLote()+" //Fecha envasado: "+getFechaEnvasado()+" //País origen: "+getPaisOrigen()+" //Temperatura mantenimiento: "+getTemperaturaMantenimiento()+" //Salinidad agua: "+salinidadAgua;
}
}


Subclase CongeladoNitrogeno que extiende de ProductoCongelado

Código: [Seleccionar]
package aplicacion;

/**
 * Subclase CongeladoNitrogeno que extiende de ProductoCongelado
 * @author David
 *
 */
public class CongeladoNitrogeno extends ProductoCongelado{

private String informacionMetodoCongelacion;
private int tiempoEsposicion;

//Constructor sobrecargado
public CongeladoNitrogeno(String fechaCaducidad, int numeroLote, String fechaEnvasado, String paisOrigen,int temperaturaMantenimiento,String informacionMetodoCongelacion,int tiempoEsposicion){
super(fechaCaducidad,numeroLote,fechaEnvasado,paisOrigen,temperaturaMantenimiento);
this.informacionMetodoCongelacion = informacionMetodoCongelacion;
this.tiempoEsposicion = tiempoEsposicion;
}

//Getters and Setters
public String getInformacionMetodoCongelacion() {
return informacionMetodoCongelacion;
}

public void setInformacionMetodoCongelacion(String informacionMetodoCongelacion) {
this.informacionMetodoCongelacion = informacionMetodoCongelacion;
}

public int getTiempoEsposicion() {
return tiempoEsposicion;
}

public void setTiempoEsposicion(int tiempoEsposicion) {
this.tiempoEsposicion = tiempoEsposicion;
}

//Método toString sobrecargado
public String toString(){
return "Fecha de caducidad: "+getFechaCaducidad()+" //Número de lote: "+getNumeroLote()+" //Fecha envasado: "+getFechaEnvasado()+" //País origen: "+getPaisOrigen()+" //Temperatura mantenimiento: "+getTemperaturaMantenimiento()+" //Información sobre el método de congelación: "+informacionMetodoCongelacion+" //Tiempo de exposicion: "+tiempoEsposicion;
}
}


Ejecución del programa

Citar
El número de productos que componen el envio es: 15
Este es la información de cada producto: Fecha de caducidad: 23/12/2017 //Número de lote: 200 //Fecha de envasado: 12/03/2017 País origen: EEUU
Este es la información de cada producto: Fecha de caducidad: 12/10/2017 //Número de lote: 150 //Fecha de envasado: 24/06/2017 País origen: Brasil
Este es la información de cada producto: Fecha de envasado: 22/02/2017 //Pais de origen: España //Fecha de caducidad: 20/11/2018 //Número de lote: 456 //Temperatura de mantenimiento: 22.0 //Código organimo: 32
Este es la información de cada producto: Fecha de envasado: 18/09/2018 //Pais de origen: Alemania //Fecha de caducidad: 14/09/2019 //Número de lote: 303 //Temperatura de mantenimiento: 14.0 //Código organimo: 50
Este es la información de cada producto: Fecha de envasado: 16/06/2018 //Pais de origen: Francia //Fecha de caducidad: 05/07/2020 //Número de lote: 105 //Temperatura de mantenimiento: 48.0 //Código organimo: 85
Este es la información de cada producto: Fecha de envasado: 04/05/2017 //Pais de origen: China //Fecha de caducidad: 11/09/2022 //Número de lote: 184 //Temperatura de mantenimiento: -30
Este es la información de cada producto: Fecha de envasado: 04/05/2017 //Pais de origen: Mexico //Fecha de caducidad: 15/05/2025 //Número de lote: 208 //Temperatura de mantenimiento: -28
Este es la información de cada producto: Fecha de envasado: 04/05/2017 //Pais de origen: Ecuador //Fecha de caducidad: 20/04/2024 //Número de lote: 302 //Temperatura de mantenimiento: -29
Este es la información de cada producto: Fecha de envasado: 04/05/2017 //Pais de origen: Tailandia //Fecha de caducidad: 30/03/2023 //Número de lote: 650 //Temperatura de mantenimiento: -27
Este es la información de cada producto: Fecha de envasado: 04/05/2017 //Pais de origen: India //Fecha de caducidad: 26/01/2021 //Número de lote: 985 //Temperatura de mantenimiento: -26
Este es la información de cada producto: Fecha de caducidad: 13/06/2020 //Número de lote: 656 //Fecha envasado: 31/04/2017 //País origen: Portugal //Temperatura mantenimiento: -25 //Salinidad agua: 4
Este es la información de cada producto: Fecha de caducidad: 24/08/2024 //Número de lote: 987 //Fecha envasado: 06/09/2017 //País origen: Italia //Temperatura mantenimiento: -26 //Salinidad agua: 8
Este es la información de cada producto: Fecha de caducidad: 25/08/2022 //Número de lote: 854 //Fecha envasado: 14/11/2017 //País origen: Puerto Rico //Temperatura mantenimiento: -30 //Composición del aire: 4
Este es la información de cada producto: Fecha de caducidad: 15/12/2023 //Número de lote: 854 //Fecha envasado: 10/08/2017 //País origen: Egipto //Temperatura mantenimiento: -28 //Composición del aire: 3
Este es la información de cada producto: Fecha de caducidad: 25/04/2026 //Número de lote: 741 //Fecha envasado: 05/04/2017 //País origen: Guatemala //Temperatura mantenimiento: -35 //Información sobre el método de congelación: info //Tiempo de exposicion: 50

Saludos  :D
« Última modificación: 17 de Junio 2017, 13:40 por Alex Rodríguez »

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Hola dferna el código se ve bien trabajado y aplica bien los conceptos

En la clase EnvioDeProductos tienes este método


   public ArrayList<Producto> crearEnvio(Producto producto){
      listaProductos.add(producto);
      return (ArrayList<Producto>) listaProductos;
   }

Aquí veo algunas cosas que serían mejorables para un buen diseño

En primer lugar si el método se llama crearEnvio, sería de esperar que fuera para crear un envío. Sin embargo hace otras cosas, por eso diría que el método no está bien nombrado.

El método añade un producto a un envío, y además devuelve la lista de productos. Esto no lo veo del todo correcto. Cada método debe tener un cometido concreto, por tanto debería haber un método getEnvio para recuperar el envío y otro método addProducto para añadir un producto.

Es muy importante nombrar correctamente a las clases y a los métodos

En los métodos toString sobrecargados, para reutilizar código lo ideal es invocar super para recuperar el código de las superclases. En realidad en este ejercicio no se pedía utilizar el método toString ya que este método no se explica hasta la entrega CU00694B

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