Adjunto, porque me empeñé en hacerlo ayer, un nuevo main para añadir tantos objetos como se quiera y listarlos.
Como dato diré que en lugar de utilizar List o Set, utilicé un único Array para todos los objetos, pues parece ser es la unica forma de añadir objetos de distinta clase (que tardé lo suyo en averiguar como diferenciar y transformar los objetos luego).
Dejo todas las clases porque algo modifiqué creo. Uso metodos statics en entradaDatos y en la principal porque realmente no necesitas instancias, como Math etc..
Clase TestHerencia2
/**
* Main alternativo de productos. Agrega tantos productos como quieras, aunque lo limité a 10 aquí. Y los muestra.
* @author Lorenzo31
* @version 12.04.2015
*/
import java.util.Iterator;
public class testHerencia2{
public static void main(String[] args){
int tamaño = 10;
int numeroMenu;
Producto [] listaProductos = new Producto [tamaño];
int indice = 0;
do{
System.out.println(" 1.- Introducir nuevo producto FRESCO \n 2.- Introducir nuevo producto CONGELADO \n 3.- Introducir nuevo producto REFRIGERADO \n 4.- Mostrar productos \n 5.- Salir ");
numeroMenu = recogerMenu();
switch(numeroMenu){
case 1: System.out.println("Creando nuevo producto fresco... \n "); //los true, false de los métodos es un boolean para distinguir si es fecha caducidad o fecha envase
listaProductos [indice] = new PFresco(recogerAño(true),recogerMes(true),recogerDia(true),recogerOrigen(),recogerAño(false),recogerMes(false),recogerDia(false),recogerNumeroLote() );
indice++; break;
case 2: System.out.println("Creando nuevo producto congelado... \n ");
listaProductos [indice] = new PCongelado(recogerAño(false),recogerMes(false),recogerDia(false), recogerTemperatura(), recogerNumeroLote() );
indice++; break;
case 3: System.out.println("Creando nuevo producto refrigerado... \n ");
listaProductos [indice] = new PRefrigerado(recogerAño(false),recogerMes(false), recogerDia(false), recogerCodigoSupervisor(), recogerNumeroLote() );
indice++; break;
case 4: System.out.println("La lista es \n");
for(int x = 0; x < indice+1; x++){
if (listaProductos[x] instanceof PFresco) {System.out.println("Producto Fresco \n"); PFresco temp = (PFresco)listaProductos[x]; temp.mostrarFechaYLote(); temp.mostrarFechaEnvasadoYOrigen();
}else if (listaProductos[x] instanceof PRefrigerado){System.out.println("Producto Refrigerado \n"); PRefrigerado temp = (PRefrigerado)listaProductos[x]; temp.mostrarFechaYLote(); temp.mostrarCodigoSupervidor();
} else if(listaProductos[x] instanceof PCongelado) { System.out.println("Producto Congelado \n"); PCongelado temp = (PCongelado)listaProductos[x]; temp.mostrarFechaYLote(); temp.mostrarTemperaturaRecomendada();
}
} break;
}
}while(numeroMenu != 5);
}
public static int recogerMenu(){ //método que controla la seleccion del menú
int numero = 0;
do{
System.out.println(" Elige una opción entre 1 y 5 \n ");
numero = EntradaDatos.recogerEntero();
} while (numero < 1 || numero > 5);
return numero;
}
public static int recogerAño(boolean envaseOCaducidad){
int numero = 0;
do{
if (envaseOCaducidad){ System.out.println(" Introduce el año de envase ");
}else { System.out.println(" Introduce el año de caducidad:"); }
numero = EntradaDatos.recogerEntero();
} while (numero < 2015 || numero > 2100);
return numero;
}
public static int recogerMes(boolean envaseOCaducidad){
int numero = 0;
do{
if (envaseOCaducidad){ System.out.println(" Introduce el mes de envase ");
}else { System.out.println(" Introduce el mes de caducidad:"); }
numero = EntradaDatos.recogerEntero();
} while (numero < 1 || numero > 12);
return numero;
}
public static int recogerDia(boolean envaseOCaducidad){
int numero = 0;
do{
if (envaseOCaducidad){ System.out.println(" Introduce el dia de envase ");
}else { System.out.println(" Introduce el dia de caducidad:"); }
numero = EntradaDatos.recogerEntero();
} while (numero < 1 || numero > 31);
return numero;
}
public static int recogerNumeroLote(){ System.out.println(" Introduce el número de Lote "); return EntradaDatos.recogerEntero(); }
public static int recogerTemperatura() {
int numero = 80;
System.out.println("Introduce la temperatura");
do{
numero = EntradaDatos.recogerEntero();
} while ( numero < -40 || numero > 50 );
return numero;
}
public static String recogerOrigen(){ System.out.println("Introduce el país de origen del producto "); return EntradaDatos.recogerCadena(); }
public static String recogerCodigoSupervisor(){ System.out.println("Introduce el código de supervisor del producto "); return EntradaDatos.recogerCadena(); }
}
Clase EntradaDatos
import java.util.Scanner;
import java.util.InputMismatchException;
public class EntradaDatos{
public static int recogerEntero(){
int numero = 1000;
do{
try{
Scanner escaner = new Scanner(System.in);
numero = escaner.nextInt();
escaner.close();
}catch (InputMismatchException e){ System.out.println("Introduce un valor numérico \n"); }
}while (numero == 1000);
return numero;
}
public static String recogerCadena(){
String cadena = "";
do{
Scanner escaner = new Scanner(System.in);
cadena = escaner.nextLine();
escaner.close();
}while(cadena == "");
return cadena;
}
}
Clase Producto
import java.util.Calendar;
import java.text.SimpleDateFormat;
/**
* Clase Producto - Consta de los atributos comunes de todo producto y los getters y setters
* necesarios para establecer las variables de instancia.
* @author Lorenzo31
* @version 10.04.2015
*/
public class Producto {
private Calendar fecha;
private int numeroLote;
//Calendar empieza en Enero = 0 por eso le resto un 1 al mes introducido por el usuario.
public Producto(int year, int month, int day, int numeroLote){
fecha = Calendar.getInstance();
fecha.set(year, month - 1, day);
this.numeroLote = numeroLote;
}
//Getters
public String getFecha() {
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
return dateFormat.format(fecha.getTime()); }
public int getNumeroLote(){ return numeroLote; }
//Setters
public void setFecha(int year, int month, int day) { fecha.set(year, month - 1, day); }
public void setNumeroLote(int numeroLote) { this.numeroLote = numeroLote; }
//Método mostrar atributos
public void mostrarFechaYLote(){
System.out.println("El número de lote es: "+ numeroLote + "\n su fecha de caducidad es: " + getFecha() );
}
} //cierre clase
Clase PFresco
import java.util.Calendar;
import java.text.SimpleDateFormat;
/**
* Clase Producto Fresco - Hereda de Producto
*
* @author Lorenzo31
* @version 10.9.2015
*/
public class PFresco extends Producto{
private Calendar fechaEnvasado;
private String origen;
//Constructor
public PFresco(int yearEnvasado, int monthEnvasado,int dayEnvasado, String origen, int yearCad, int monthCad, int dayCad, int numeroLote){
super(yearCad,monthCad,dayCad,numeroLote);
fechaEnvasado = Calendar.getInstance();
fechaEnvasado.set(yearEnvasado, monthEnvasado,dayEnvasado);
this.origen = origen;
}
//Getters
public String getOrigen(){ return origen; }
public String getFechaEnvasado() {
SimpleDateFormat formato = new SimpleDateFormat("dd-MM-yyyy");
return formato.format(fechaEnvasado.getTime()); }
//Método mostrar fecha envasado y origen
public void mostrarFechaEnvasadoYOrigen(){
System.out.println("su origen es: " + origen + "\n y su fecha de envasado es: " + getFechaEnvasado() + "\n" );
}
}
Clase PCongelado
/**
* Clase Producto Congelado hereda de Producto
*
* @author (your name)
* @version (a version number or a date)
*/
public class PCongelado extends Producto {
private int temperaturaRecomendada;
public PCongelado(int yearCad, int monthCad, int dayCad, int temperaturaRecomendada, int numeroLote){
super(yearCad, monthCad, dayCad, numeroLote);
this.temperaturaRecomendada = temperaturaRecomendada;
}
public int getTemperatura() { return temperaturaRecomendada; }
public void setTemperatura( int temperaturaRecomendada ){ this.temperaturaRecomendada = temperaturaRecomendada; }
//Método para Mostrar temperaturaRecomendada
public void mostrarTemperaturaRecomendada(){
System.out.println(" su temperatura recomendada es: " + temperaturaRecomendada + "\n"); }
}
Clase PRefrigerado
/**
* Clase Productos Refrigerados hereda de Producto
*
* @author Lorenzo31
* @version 10.4.2015
*/
public class PRefrigerado extends Producto{
private String codigoSupervisor;
public PRefrigerado(int yearCad, int monthCad, int dayCad, String codigoSupervisor, int numeroLote){
super(yearCad, monthCad, dayCad, numeroLote);
this.codigoSupervisor = codigoSupervisor;
}
public String getCodigoSupervisor() { return codigoSupervisor; }
public void setCodigoSupervisor(String codigoSupervisor){ this.codigoSupervisor = codigoSupervisor; }
//Metodo mostrar codigoSupervisor
public void mostrarCodigoSupervidor() {
System.out.println(" su codigo de supervisor es: " + codigoSupervisor + "\n" );
}
}