Autor Tema: Ejercicio resuelto de herencia en Java. CU00686B Diseñar un esquema de herencia  (Leído 3972 veces)

arcanFAC

  • Visitante
Hola nuevamente, en este caso quiero poner a revisión este ejercicio:

Citar
Se plantea desarrollar un programa Java que permita la gestión de una empresa agroalimentaria que trabaja con tres tipos de productos: productos frescos, productos refrigerados y productos congelados. Todos los productos llevan esta información común: fecha de caducidad y número de lote. A su vez, cada tipo de producto lleva alguna información específica. Los productos frescos deben llevar la fecha de envasado y el país de origen. Los productos refrigerados deben llevar el código del organismo de supervisión alimentaria. Los productos congelados deben llevar la temperatura de congelación recomendada. Crear el código de las clases Java implementando una relación de herencia desde la superclase Producto hasta las subclases ProductoFresco, ProductoRefrigerado y ProductoCongelado. Cada clase debe disponer de constructor y permitir establecer (set) y recuperar (get) el valor de sus atributos y tener un método que permita mostrar la información del objeto. Crear una clase testHerencia2 con el método main donde se cree un objeto de cada tipo y se muestren los datos de cada uno de los objetos creados.


Decidí hacerle unos cambios, que en vez de un solo objeto la persona pudiera ingresar cuantos quisiera, tambien decidí para evitar confusiones que en la clase producto tambien estuviera la variable nombre para que la persona pudiera diferenciarlos todos cuando se impriman todos los objetos. Se que no es tal cual lo pedia el ejercicio pero lo decidí hacer así para practicar algunas cosas que hemos visto a lo largo del curso.

Aquí mi superclase Producto:

Código: [Seleccionar]
public class Producto {
private String fechaDeCaducidad;
private String numeroDeLote;
private String nombreProducto;

public Producto(){
fechaDeCaducidad = "desconocido";
numeroDeLote = "desconocido";
nombreProducto = "desconocido";
}

public Producto(String fechaDeCaducidad, String numeroDeLote, String nombreProducto){
this.fechaDeCaducidad = fechaDeCaducidad;
this.numeroDeLote = numeroDeLote;
this.nombreProducto = nombreProducto;
}

public void setFechaDeCaducidad(String fechaDeCaducidad){
this.fechaDeCaducidad = fechaDeCaducidad;
}

public String getFechaDeCaducidad(){
return fechaDeCaducidad;
}

public void setNumeroDeLotes(String numeroDeLote){
this.numeroDeLote = numeroDeLote;
}

public String getNumeroDeLote(){
return numeroDeLote;
}

public void setNombreProducto(String nombreProducto){
this.nombreProducto = nombreProducto;
}

public String getNombreProducto(){
return nombreProducto;
}

}

Aquí mis subclases:

Código: [Seleccionar]
public class ProductoFresco extends Producto{
private String fechaDeEnvasado;
private String paisOrigen;

public ProductoFresco(){
super();
fechaDeEnvasado = "";
paisOrigen = "";
}

public ProductoFresco(String fechaDeCaducidad, String numeroDeLote, String nombreProducto, String fechaDeEnvasado, String paisOrigen){
super(fechaDeCaducidad, numeroDeLote, nombreProducto);
this.fechaDeEnvasado = fechaDeEnvasado;
this.paisOrigen = paisOrigen;
}

public void setFechaDeEnvasado(String fechaDeEnvasado){
this.fechaDeEnvasado = fechaDeEnvasado;
}

public String getFechaDeEnvasado(){
return fechaDeEnvasado;
}

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

public String getPaisOrigen(){
return paisOrigen;
}

public void imprimirInformacion(){
System.out.println("\nNombre del producto: " + getNombreProducto() + "\nFecha de caducidad: " + getFechaDeCaducidad() + "\nNumero de lote: " +
    getNumeroDeLote() + "\nFecha de envasado: " + getFechaDeEnvasado() + "\nPais de origen: " + getPaisOrigen());
}

}


Código: [Seleccionar]
public class ProductoRefrigerado extends Producto{
private String codigoOSA;

public ProductoRefrigerado(){
super();
codigoOSA = "desconocido";
}

public ProductoRefrigerado(String fechaDeCaducidad, String numeroDeLote, String nombreProducto, String codigoOSA){
super(fechaDeCaducidad, numeroDeLote, nombreProducto);
this.codigoOSA = codigoOSA;
}

public void setCodigoOSA(String codigoOSA){
this.codigoOSA = codigoOSA;
}

public String getCodigoOSA(){
return codigoOSA;
}

public void imprimirInformacion(){
System.out.println("\nNombre del producto: " + getNombreProducto() +  "\nFecha de caducidad: " + getFechaDeCaducidad() +"\nNumero de lote : " +
    getNumeroDeLote() + "\nCodigo del organismo de supervisión alimentaria: " + getCodigoOSA());
}

}


Código: [Seleccionar]
public class ProductoCongelado extends Producto{
private String tempCongelacionR;

public ProductoCongelado(){
super();
tempCongelacionR = "desconocido";
}

public ProductoCongelado(String fechaDeCaducidad, String numeroDeLote, String nombreProducto, String tempCongelacionR){
super(fechaDeCaducidad, numeroDeLote, nombreProducto);
this.tempCongelacionR = tempCongelacionR;
}

public void setTempCongelacionR(String tempCongelacionR){
this.tempCongelacionR = tempCongelacionR;
}

public String getTempCongelacionR(){
return tempCongelacionR;
}

public void imprimirInformacion(){
System.out.println("\nNombre del producto: " + getNombreProducto() + "\nFecha de caducidad: " + getFechaDeCaducidad()+ "\nNumero de lote: " +
    getNumeroDeLote() + "\nTemperatura de congelación recomendada: " + getTempCongelacionR());
}

}


Aquí mi clase Intermedio que es la que hace praticamente todo el trabajo:

Código: [Seleccionar]
import java.util.Scanner;
import java.util.LinkedList;
public class Intermedio {
private LinkedList<ProductoFresco> productosFrescos;
private LinkedList<ProductoRefrigerado> productosRefrigerados;
private LinkedList<ProductoCongelado> productosCongelados;

public Intermedio(){
productosFrescos = new LinkedList<ProductoFresco>();
productosRefrigerados = new LinkedList<ProductoRefrigerado>();
productosCongelados = new LinkedList<ProductoCongelado>();
}

public void ingresarProducto(String caracteristica){
Scanner sc = new Scanner(System.in);
String fechaDeCaducidad = "", numeroDeLote = "", nombreDelProducto = "";
System.out.print("Por favor ingrese la información del producto.\nNombre del producto: ");
nombreDelProducto = sc.nextLine();
System.out.print("Fecha de caducidad: ");
fechaDeCaducidad = sc.nextLine();
System.out.print("Numero de lote: ");
numeroDeLote = sc.nextLine();
switch(caracteristica){
case "Fresco":
    productosFrescos.add(ingresarProductoFresco(fechaDeCaducidad, numeroDeLote, nombreDelProducto));
    break;
        case "Refrigerado":
        productosRefrigerados.add(ingresarProductoRefrigerado(fechaDeCaducidad, numeroDeLote, nombreDelProducto));
    break;
case "Congelado":
    productosCongelados.add(ingresarProductoCongelado(fechaDeCaducidad, numeroDeLote, nombreDelProducto));
    break;
default:
    break;
}
}



private ProductoCongelado ingresarProductoCongelado(String fechaDeCaducidad, String numeroDeLote, String nombreDelProducto) {
Scanner sc = new Scanner(System.in);
String tempCongelacionR = "";
System.out.print("Temperatura de congelacion recomendada: ");
tempCongelacionR = sc.nextLine();
ProductoCongelado producto = new ProductoCongelado(fechaDeCaducidad, numeroDeLote, nombreDelProducto, tempCongelacionR);
return producto;
}

private ProductoRefrigerado ingresarProductoRefrigerado(String fechaDeCaducidad, String numeroDeLote, String nombreDelProducto) {
Scanner sc = new Scanner(System.in);
String codigoOSA = "";
System.out.print("Codigo del organismo de supervisión alimentaria: ");
codigoOSA = sc.nextLine();
ProductoRefrigerado producto = new ProductoRefrigerado(fechaDeCaducidad, numeroDeLote, nombreDelProducto, codigoOSA);
return producto;
}

private ProductoFresco ingresarProductoFresco(String fechaDeCaducidad, String numeroDeLote, String nombreDelProducto) {
Scanner sc = new Scanner(System.in);
String fechaDeEnvasado = "", paisOrigen = "";
System.out.print("Fecha de envasado: ");
fechaDeEnvasado = sc.nextLine();
System.out.print("Pais de origen: ");
paisOrigen = sc.nextLine();
ProductoFresco producto = new ProductoFresco(fechaDeCaducidad, numeroDeLote, nombreDelProducto, fechaDeEnvasado, paisOrigen);
return producto;
}

public void imprimirProductos(){
System.out.println("\nLos productos frescos que han sido guardados son:");
for(ProductoFresco producto: productosFrescos)
producto.imprimirInformacion();
System.out.println("\nLos productos refrigerados que han sido guardados son:");
for(ProductoRefrigerado producto: productosRefrigerados)
producto.imprimirInformacion();
System.out.println("\nLos productos congelados que han sido guardados son:");
for(ProductoCongelado producto: productosCongelados)
producto.imprimirInformacion();
}
}


Y finalmente el main:

Código: [Seleccionar]
import java.util.Scanner;
public class testHerencia2 {

public static void main(String[] args){
Scanner sc = new Scanner(System.in);
Intermedio productos = new Intermedio();
String tipoProducto = "";
int cantidad = 0;
do {
tipoProducto = llamadoAIngresar();
System.out.print("Cuantos articulos de este tipo de producto desea ingresar: ");
cantidad = Integer.parseInt(sc.next());
for(int i=0; i<cantidad; i++)
        productos.ingresarProducto(tipoProducto);
    System.out.print("Ingrese (si) si desea ingresar mas información de otro tipo de productos de lo contrario ingrese cualquier palabra:");
    sc.nextLine();
    }while("si".equals(sc.nextLine()));
productos.imprimirProductos();
}

public static String llamadoAIngresar(){
Scanner sc = new Scanner(System.in);
int valor = 0;
System.out.println("Producto Fresco(1)\nProducto Refrigerado(2)\nProducto Congelado(cualquier número excepto 1 y 2)\nPor favor ingrese el numero del producto que desea ingresar");
valor = Integer.parseInt(sc.next());
if(valor == 1)
return "Fresco";
else if(valor == 2)
return "Refrigerado";
else
return "Congelado";
}

}

Lo siento por haberle realizado estos ajustes pero era para practicar mas.

Saludos. :)
« Última modificación: 14 de Abril 2015, 08:43 por Alex Rodríguez »

toni_apr

  • Avanzado
  • ****
  • Mensajes: 497
  • Curiosidad, es uno de los pilares del Conocimiento
    • Ver Perfil
Re:Aprender java.(CU00686B). Herencia en java.
« Respuesta #1 en: 12 de Abril 2015, 16:42 »
Hola arcanFAC

Me ha gustado tu versión para este ejercicio. OK
Y has añadido la clase Intermedio que controla las listas de los productos. Bien.

Aquí van mis comentarios a tu código con posibles mejoras.

Todos tus productos tienen el método imprimirInformacion() excepto la clase Producto. Si esta clase también lo tubiera, sería mas o menos:
Código: [Seleccionar]
    public void imprimirInformacion(){
    System.out.println("\nNombre del producto: " + getNombreProducto() + "\nFecha de caducidad: " + getFechaDeCaducidad()+ "\nNumero de lote: ");

Y luego en los productos que heredan de esta clase, el método imprimirInformacion() quedaría más o menos así para la clase ProductoCongelado:
Código: [Seleccionar]
    public void imprimirInformacion(){
        super.imprimirInformacion();
        System.out.println( "\nTemperatura de congelación recomendada: " + getTempCongelacionR());
    }
Como ves, invocamos el método imprimirInformacion() de la clase padre y luego presentamos los atributos propios de la clase actual.

Luego en la clase Intermedio en el método imprimirProductos(), con un condicional, si tu lista de productos está vacía, en lugar de mostrar el mensaje:
    Los productos frescos que han sido guardados son:
seguido de una lista en blanco.
Mostrar otro como:
    No hay productos fescos guardados.

Como ves no son grandes mejoras, pero ayudan en el primer caso a no repetir código (si hubiera que modificarlo bastaría con hacerlo en la clase Producto, no en cada una de las clases herederas) y en el segundo a no mostrar mensajes inexactos.

Saludos

arcanFAC

  • Visitante
Hola Toni, gracias por las sugerencias, las tendré en cuenta para los proximos ejercicios.
Saludos.   :D

 

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