Autor Tema: Ejemplo de herencia en Java. Uso de palabras clave extends y super. CU00686B  (Leído 6492 veces)

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 381
    • Ver Perfil
Buenas tardes, dejo mi solución para el ejercicio.

Clase Producto

Código: [Seleccionar]
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

Código: [Seleccionar]
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() );
    }
}


Clases PCongelado

Código: [Seleccionar]

/**
 * 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); }
}


Clase PRefrigerados

Código: [Seleccionar]


/**
 * 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 );
    }

}

Clase TestHerencia2

Código: [Seleccionar]

public class testHerencia2{

    public static void main(String[] args){

        //Creación de objetos
        PFresco producto1 = new PFresco(2015, 2, 20, "España", 2015, 5, 10, 2230);
        PRefrigerado producto2 = new PRefrigerado(2015, 6, 10, "X-102", 1234);
        PCongelado producto3 = new PCongelado(2016, 2, 25, -3, 3212);
       
        //Imprimimos los objetos
        System.out.println("\n Producto Fresco");
        producto1.mostrarFechaYLote();
        producto1.mostrarFechaEnvasadoYOrigen();
       
        System.out.println("\n Producto Refrigerado");
        producto2.mostrarFechaYLote();
        producto2.mostrarCodigoSupervidor();
       
        System.out.println("\n Producto Congelado");
        producto3.mostrarFechaYLote();
        producto3.mostrarTemperaturaRecomendada();
       
    }
}
« Última modificación: 14 de Abril 2015, 23:30 por Alex Rodríguez »

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 381
    • Ver Perfil
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
Código: [Seleccionar]

/**
 * 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

Código: [Seleccionar]
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

Código: [Seleccionar]

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

Código: [Seleccionar]
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

Código: [Seleccionar]


/**
 * 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

Código: [Seleccionar]


/**
 * 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" );
    }

}

toni_apr

  • Avanzado
  • ****
  • Mensajes: 497
  • Curiosidad, es uno de los pilares del Conocimiento
    • Ver Perfil
Hola Lorenzo

Iba a comentar tu mensaje previo, pero al ver tu nueva versión, me tomo mi tiempo para mi nuevo comentario

Saludos y hasta pronto

toni_apr

  • Avanzado
  • ****
  • Mensajes: 497
  • Curiosidad, es uno de los pilares del Conocimiento
    • Ver Perfil
Hola Lorenzo

La estructura de clases en tu ejercicio es correcta. OK.
Y gestionas las fechas con la clase Calendar. Bien.

Solo he visto un pequeño defecto inducido tal vez por las prisas.
En el constructor de la clase PFresco la instrucción:
        fechaEnvasado.set(yearEnvasado, monthEnvasado,dayEnvasado);
debería ser:
        fechaEnvasado.set(yearEnvasado, monthEnvasado-1,dayEnvasado);

Tu nueva clase testHerencia2 está muy bien, permitiendo añadir productos de varios tipos.
Aunque el uso de un array limitado a 10 elementos necesitaría código suplementario para ampliar su tamaño.
Se puede usar la clase ArrayList para guardar los productos y ella misma ampliará su tamaño cuando lo necesite en forma transparente para nosotros. Adjunto versión modificada con ArrayList


En este ejercicio se puede usar la herencia de las clases a la hora de mostrar la información de cada producto.
En lugar de que cada producto tenga un método de nombre único para mostrar los atributos de la clase, se puede crear en cada clase el método por ejemplo mostrarDatos() que contendrá en cada clase las intrucciones necesarias para mostrar dichos atributos, resultando así que el método en la clase Producto sería:
Código: [Seleccionar]
    public void mostrarDatos(){
        System.out.println("El número de lote es: "+ numeroLote +
        "\n su fecha de caducidad es: " + getFecha() );
    }
y en la clase PFresco:
Código: [Seleccionar]
    public void mostrarDatos(){
        super.mostrarDatos();
        System.out.println("su origen es: " + origen +
        "\n y su fecha de envasado es: " + getFechaEnvasado() + "\n" );
    }

Estos cambios permiten sustituir la siguiente línea en la opción 4 del main:
Código: [Seleccionar]
    if (listaProductos.get(x) instanceof PFresco) { System.out.println("Producto Fresco \n"); PFresco temp = (PFresco)listaProductos.get(x); temp.mostrarFechaYLote(); temp.mostrarFechaEnvasadoYOrigen(); por la línea:
Código: [Seleccionar]
    if (listaProductos.get(x) instanceof PFresco) { System.out.println("Producto Fresco \n"); PFresco temp = (PFresco)listaProductos.get(x); temp.mostrarDatos();
Clase testHerencia3
Código: [Seleccionar]
import java.util.ArrayList;
import java.util.Iterator;

public class testHerencia3{

    public static void main(String[] args){

//         int tamaño = 10;
        int numeroMenu;
//         Producto [] listaProductos = new Producto [tamaño];
        ArrayList<Producto> listaProductos = new ArrayList<Producto>();
        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() );
                listaProductos .add( 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() );
                listaProductos  .add( 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() );
                listaProductos  .add( 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; x++){
                      if (listaProductos.get(x) instanceof PFresco) { System.out.println("Producto Fresco \n"); PFresco temp = (PFresco)listaProductos.get(x); temp.mostrarFechaYLote(); temp.mostrarFechaEnvasadoYOrigen();
                    }else if (listaProductos.get(x) instanceof PRefrigerado){System.out.println("Producto Refrigerado \n"); PRefrigerado temp = (PRefrigerado)listaProductos.get(x); temp.mostrarFechaYLote(); temp.mostrarCodigoSupervidor();
                    } else if(listaProductos.get(x) instanceof PCongelado) { System.out.println("Producto Congelado \n"); PCongelado temp = (PCongelado)listaProductos.get(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(); }
}

Saludos y adelante

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 381
    • Ver Perfil
Buenas tardes toni, gracias como siempre por tus comentarios y la molestia de revisar el código.

Sobre el error, si en envasados también va el -1 cierto. Descuido grande porque ya lo habia controlado en la otra fecha.

Sobre mostrar los datos propios de cada clase, ya lo hago pues Producto tiene el metodo que muestra numeroLote y fecha, que es común a todos los hijos.
Y lo mismo hago en las clases hijas, pero quizá el nombre que le puse no era muy clarificante y ahí mi error, en el futuro pensaré mas genérico que creo a eso te refieres.

Código: [Seleccionar]
//Método mostrar atributos

public void mostrarFechaYLote(){
    System.out.println("El número de lote es: "+ numeroLote + "\n su fecha de caducidad es: " + getFecha() );
}


Código: [Seleccionar]

//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" );
    }

La array la limité a 10 yo por poner algo, al controlar el contador, no hay más que poner un contador ++ para que aumente el tamaño del array con cada nuevo producto, pero mi pregunta es, ArrayList, tambien acepta añadir clases hijas y las distingue de la padre <Productos>?


Como veo que lo has remodelado con ArrayList, voy a tomarme un rato para ver tu código y añado luego aquí, guardo sitio :)
MODIFICO

Efectivamente funciona perfectamente, le cambie el int de tamaño al for por un listaProductos.size() y perfecto, por lo que habia leido solo array guarda objetos de diferentes clases, ArrayList tambien lo hace o es que leí mal y LinkedList TreeSet etc tb lo hacen?

Adjunto codigo TestHerencia2 ya finalizado

Código: [Seleccionar]
import java.util.ArrayList;
/**
 * 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];
        ArrayList<Producto> listaProductos = new ArrayList<Producto>();
        //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() );
                listaProductos.add( 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() );
                listaProductos.add( 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() );
                listaProductos  .add( 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 < listaProductos.size(); 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();
                    } */
                    if (listaProductos.get(x) instanceof PFresco) { System.out.println("Producto Fresco \n"); PFresco temp = (PFresco)listaProductos.get(x); temp.mostrarFechaYLote(); temp.mostrarFechaEnvasadoYOrigen();
                    }else if (listaProductos.get(x) instanceof PRefrigerado){System.out.println("Producto Refrigerado \n"); PRefrigerado temp = (PRefrigerado)listaProductos.get(x); temp.mostrarFechaYLote(); temp.mostrarCodigoSupervidor();
                    } else if(listaProductos.get(x) instanceof PCongelado) { System.out.println("Producto Congelado \n"); PCongelado temp = (PCongelado)listaProductos.get(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(); }
}

Tambien queria preguntar si todos los metodos staticos de debajo del main estan bien ahí o debia crear una clase para ellos, no lo encontré necesario pero pregunto por aprender, tengo muy en cuenta todas las sugerencias para no repetir errores.
« Última modificación: 12 de Abril 2015, 20:52 por Lorenzo31 »

toni_apr

  • Avanzado
  • ****
  • Mensajes: 497
  • Curiosidad, es uno de los pilares del Conocimiento
    • Ver Perfil
Hola Lorenzo

Si. En tu código muestras los datos propios de la clase y los de la padre. Es correcto.

Y no me refiero al nombre que das a los métodos, sino a que los cambios que te propongo tienen dos ventajas:

1ª El mismo nombre en todas las clases. Evita recordar nombres diferentes para diferentes clases.

2ª Al llamar al método para mostrar sus datos, es el propio método el que llama al método padre para mostrar todos los datos siguiendo el árbol de herencia. Esta ventaja es más evidente cuando el árbol de herencia tiene más de un grado/nivel como el actual.


Citar
Efectivamente funciona perfectamente, le cambie el int de tamaño al for por un listaProductos.size() y perfecto, por lo que habia leido solo array guarda objetos de diferentes clases, ArrayList tambien lo hace o es que leí mal y LinkedList TreeSet etc tb lo hacen?

Limitar el fin del for con el tamaño de la lista listaProductos.size() es ideal. Respeté la variable 'indice' para no trastocar demasiado tu código.


Ya sabes que la principal diferencia entre array y ArrayList es que:

array puede contener tanto primitivos como objetos, pero solo un tipo cada vez, o un conjunto de primitivos, o uno de objetos, es decir todos los elementos del mismo tipo.

Y ArrayList solo puede contener objetos, no primitivos y también objetos del mismo tipo.

El ArrayList del ejemplo solo guarda objetos de un tipo, el tipo 'Producto'. Es gracias a la herencia, que Java puede distinguir que subclase de 'Producto' está manipulando, ya sea PFresco o PCongelado, etc.

Ya hemos visto en ejercicios anteriores sobre polimorfismo (CU00678B), que se pueden guardar objetos de distinto tipo sin relación de herencia en una colección, cuando todos los objetos pertenecen a la misma interface.


En cuanto a los métodos estáticos en la clase del main.
Me lo has puesto muy fácil, todos esos métodos empiezan por el prefijo 'recoger'.
Pues es una buena idea colocarlos en una clase aparte 'Recoger' tal vez, y dentro de ella los métodos pierden el prefijo 'recoger' y los llamas desde el main por ejemplo así:
    Recoger.menu();
    Recoger.año(boolean envaseOCaducidad);
etc. tal como haces con la clase EntradaDatos.

Si solo fueran dos o tres métodos, tal vez no haría falta, pero ahora tienes unos cuantos y como resultado la clase del main parece más ligera.

Aprovecho la ocasión para apuntar.
BlueJ acepta la 'ñ' en el código, pero no sé otros IDEs o sistemas. De la misma forma que no usamos acentos en el código, es mejor no usar los acentos ni eñes y usar palabras que no incorporen esos signos de puntuación.

Saludos

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 381
    • Ver Perfil
Entendido todo, tomo nota, y ya entiendo lo de mostrarDatos() y mostrarDatos() con super dentro.

Gracias toni como siempre.

Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Hola, en relación al comentario de toni

Citar
Aprovecho la ocasión para apuntar.
BlueJ acepta la 'ñ' en el código, pero no sé otros IDEs o sistemas. De la misma forma que no usamos acentos en el código, es mejor no usar los acentos ni eñes y usar palabras que no incorporen esos signos de puntuación.

La opción de no usar eñes ni tildes es lo más recomendable porque aunque puede ser aceptada en general por Java y por distintos IDEs, se nos puede presentar un problema cuando tratemos de trasladar y ejecutar el código en algunos sistemas donde no se reconocen esos caracteres.

En resumen, si en nuestro pc se ejecuta el código con tildes y eñes podemos usar estos caracteres, pero para tratar de ser lo más compatibles posibles con cualquier sistema y pc preferible evitar usar estos caracteres.

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