Autor Tema: Diseño orientado a objetos Java clases herencia extends y super ejemplo CU00686B  (Leído 2057 veces)

paramonso

  • Intermedio
  • ***
  • Mensajes: 241
  • El ignorante afirma, el sabio duda y reflexiona.
    • Ver Perfil
Hola. Dejo el ejercicio CU00686B del curso aprende programación Java como si estuvieras en primero. Ejemplo de herencia en Java. Uso de palabras clave extends y super. Constructores con herencia. 

Citar
EJERCICIO

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.

SuperClase : Productos.
SubClases de Productos :ProductosFrescos, ProductosRefrigerados,ProductosCongelados.

Programa ejecutable (main):TestHerencia2 llama a DatosTecladoPantalla y en este se crean los objetos.
DatosTecladoPantalla: Llama a entrada de datos por teclado para entrar los datos en la SuperClase y en las SubClases utilizando los métodos set.
Tambien se llama a la SuperClase y SubClases para hacer presentación de datos en pantalla con los metodos get y una llamada a pausar para pausar la pantalla y al pulsar enter borrar pantalla .


Código de la SuperClase Productos

Código: [Seleccionar]

/**
 * gestión de una empresa agroalimentaria que
 *trabaja con tres tipos de productos: productos frescos,
 *productos refrigerados y productos congelados.
 *
 * @author (aprenderaprogramar.com //Pablo Ramón Pérez Blasco "paramonso")
 * @version (1.0 rev 1)
 */
// Super Clase Productos
public class Productos
{
    // instance variables - replace the example below with your own
    public String fechaCaducidad;
    public String numeroLote;

    /**
     * Constructor for objects of class Producto
     */
    public Productos(String fechaCaducidad,String numeroLote)
    {
        this.fechaCaducidad = fechaCaducidad;
        this.numeroLote=numeroLote;
    }

    public Productos( )
    {
        fechaCaducidad ="";
        numeroLote="";
    }

    public String getFechaCaducidad() { return fechaCaducidad; }

    public String getNumeroLote(){return numeroLote;}

    public void setFechaCaducidad  ( ) {
        this.fechaCaducidad = fechaCaducidad;
    } //Cierre del método
    public void setNumeroLote  ( ) {
        this.numeroLote = numeroLote;
    } //
}


Codigo de la SubClase ProductosFrescos

Código: [Seleccionar]
/**
 * SubClase productos frescos de la SuperClase Productos
 */
public class ProductosFrescos extends Productos
{
    public String fechaEnvasado;
    public String paisOrigen;

    /**
     * Constructor para los objetos de la clase ProductosFrescos
     */
    public ProductosFrescos(String fechaCaducidad,String numeroLote,String fechaEnvasado,String paisOrigen )
    { super(fechaCaducidad ,numeroLote);
        this.fechaEnvasado = fechaEnvasado;
        this.paisOrigen=paisOrigen;
    }

    public ProductosFrescos(  ){
        super();
        fechaEnvasado="";
        paisOrigen="";
    }

    public String getFechaEnvasado() { return fechaEnvasado; }

    public String getPaisOrigen(){return paisOrigen;}

    public void setFechaEnvasado  ( ) {
        this.fechaEnvasado = fechaEnvasado;
    } //Cierre del método
    public void setPaisOrigen  ( ) {
        this.paisOrigen = paisOrigen;
    } //

}


Codigo de la SubClase ProductosRefrigetados

Código: [Seleccionar]

/**
 *  SubClase Productos Refrigerados de la SuperClase Productos  .
 *
 */
public class ProductosRefrigerados extends Productos
{
    public String  codigoOSA; //codigoOSA ==> codigo Organismo Supervision Alimentaria

    /**
     * Constructor para los objetos de la clase ProductosRefrigerados
     */
    public ProductosRefrigerados(String fechaCaducidad,String numeroLote,String codigoOSA )
    { super(fechaCaducidad ,numeroLote);
        this. codigoOSA =  codigoOSA;

    }

    public ProductosRefrigerados(  )
    { super( );
        codigoOSA ="";

    }

    public String getCodigoOSA() { return codigoOSA; }

    public void setCodigoOSA  ( ) {
        this.codigoOSA = codigoOSA;
    } //Cierre del método

}



Codigo de la SubClase ProductosCongelados

Código: [Seleccionar]

/**
 *  SubClase Productos Congelados de la SuperClase Productos
 */
public class ProductosCongelados extends Productos
{
    public int temperaturaCongelacion ;
    /**
     * Constructor para los objetos de la clase ProductosCongelados
     */
    public ProductosCongelados(String fechaCaducidad,String numeroLote,int temperaturaCongelacion)
    { super(fechaCaducidad ,numeroLote);
        this. temperaturaCongelacion =  temperaturaCongelacion;

    }

    public ProductosCongelados()
    { super();
        temperaturaCongelacion = 0;

    }

    public int getTemperaturaCongelacion(){ return temperaturaCongelacion;}

    public void setTemperaturaCongelacion(){
        this.temperaturaCongelacion=temperaturaCongelacion;
    }
}


 Codigo de la clase TestHerencia2

Código: [Seleccionar]
/**
 *  programa ejecutable main
 */
public class TestHerencia2
{
    public static void main (String[ ] Args) {
        DatosTecladoPantalla pedirDatos=new DatosTecladoPantalla();
        pedirDatos.PedirDatos();
       
    } //Cierre del main
    // Metodo para pausar y borrar pantalla
   
}


Codigo de la clase DatosTecladoPantalla

Código: [Seleccionar]

/**
 * Pide la entrada de datos por teclado y los presenta en pantalla
 *
 * @author (Pablo)
 * @version (0.0)
 */
public class DatosTecladoPantalla
{
    public   DatosTecladoPantalla(){
   
    }
   
public void PedirDatos(){
//inicializar variables de la Superclase Productos
        String fechaCaducidad="";
        String numeroLote="";
        //inicializar variables de la Subclase ProductosFrescos
        String fechaEnvasado;
        String paisOrigen;
        //inicializar variables de la Subclase ProductosRefrigerados
        String  codigoOSA;
        //inicializar variables de la Subclase ProductosCongelados
        int temperaturaCongelacion ;
        //Entrada de datos en la Superclase Productos
        System.out.println("****** ENTRADA DE DATOS EN PRODUCTOS ******");
        System.out.print ("Por favor introduzca la fecha de caducidad ");
        EntradaDeTeclado entrada = new EntradaDeTeclado();
        entrada.pedirEntrada();
        fechaCaducidad=entrada.getEntrada();
        System.out.print ("Por favor introduzca el numero de lote :  ");
        entrada.pedirEntrada();
        numeroLote=entrada.getEntrada();
        Productos testProducto=new Productos(fechaCaducidad,numeroLote);

        //Entrada de datos en la Subclase ProductosFrescos
        System.out.println("****** ENTRADA DE DATOS EN PRODUCTOS FRESCOS ******");
        System.out.print ("Por favor introduzca la fecha de envasado ");
        entrada.pedirEntrada();
        fechaEnvasado=entrada.getEntrada();
        System.out.print ("Por favor introduzca el pais de Origen : ");
        entrada.pedirEntrada();
        paisOrigen= entrada.getEntrada();
        ProductosFrescos testProFresco=new ProductosFrescos(fechaCaducidad,numeroLote,fechaEnvasado,paisOrigen);

        //Entrada de datos en la Subclase ProductosRefrigerados
        System.out.println("****** ENTRADA DE DATOS EN PRODUCTOS REFRIGERADOS ******");
        System.out.print ("Por favor introduzca el codigoOSA  (Organismo Supervision Alimentaria) :");
        entrada.pedirEntrada();
        codigoOSA=entrada.getEntrada();
        ProductosRefrigerados testProRefri=new ProductosRefrigerados(fechaCaducidad,numeroLote,codigoOSA);
        //Entrada de datos en la Subclase ProductosCongelados
        System.out.println("****** ENTRADA DE DATOS EN PRODUCTOS CONGELADOS ******");
        System.out.print ("Por favor introduzca temperatura de congelación recomendada :");
        entrada.pedirEntrada();
        temperaturaCongelacion=Integer.valueOf(entrada.getEntrada());
        ProductosCongelados testProConge=new ProductosCongelados(fechaCaducidad,numeroLote,temperaturaCongelacion );
        Pausar.pause();//Pausar y borrar pantalla
        PresentarDatos( fechaCaducidad, numeroLote, fechaEnvasado,  paisOrigen,
                                 codigoOSA,  temperaturaCongelacion);
}
    public void PresentarDatos(String fechaCaducidad,String numeroLote,String fechaEnvasado,String paisOrigen,
                                String codigoOSA,int temperaturaCongelacion)
    {
        Productos testProducto=new Productos(fechaCaducidad,numeroLote);
        ProductosFrescos testProFresco=new ProductosFrescos(fechaCaducidad,numeroLote,fechaEnvasado,paisOrigen);
        ProductosRefrigerados testProRefri=new ProductosRefrigerados(fechaCaducidad,numeroLote,codigoOSA);
        ProductosCongelados testProConge=new ProductosCongelados(fechaCaducidad,numeroLote,temperaturaCongelacion );

        System.out.print ("******DATOS EN PRODUCTOS*****\n"+
            "Fecha de caducidad : "
            +testProducto.getFechaCaducidad()+
            "\nNumero de lote : "+
            testProducto.getNumeroLote()+
            "\n-------------------\n" );
           
        System.out.print ("******DATOS EN PRODUCTOS FRESCOS******\n" +
            "Fecha de caducidad  : "+
            testProFresco.getFechaCaducidad()+
            "\nNumero de lote : "
            +testProFresco.getNumeroLote()+
            "\nFecha Envasado : "+
            testProFresco.getFechaEnvasado()+
            " \nPais de Origen : "+
            testProFresco.getPaisOrigen()+
            "\n-------------------\n");
       
        System.out.print ("******DATOS EN PRODUCTOS REFRIGERADOS******\n"+
            "Fecha de caducidad  : "+
            testProRefri.getFechaCaducidad()+
            "\nNumero de lote : "+
            testProRefri.getNumeroLote()+
            "\nCodigo OSA :"+testProRefri.getCodigoOSA()+
            "\n-------------------\n");
         
        System.out.print ("******DATOS EN PRODUCTOS CONGELADOS******\n"+
            "Fecha de caducidad  : "+
            testProConge.getFechaCaducidad()+
            "\nNumero de lote : "+
            testProConge.getNumeroLote()+
            "\nTemperatura Congelacion Recomendada : "+
            testProConge.getTemperaturaCongelacion()+
            "\n-------------------\n");
        Pausar.pause();//Pausar y borrar pantalla
    }
}



Codigo de la Clase EntradaDeTeclado

Código: [Seleccionar]
import java.util.Scanner; //Importación de la clase Scanner desde la biblioteca Java
/**
 * Entrada de datos por teclado
 *
 * @author (Pablo)
 * @version (0.0)
 */
public class EntradaDeTeclado {  // Definimos la clase EntradaDeTeclado aprenderaprogramar.com
   private String entradaTeclado; //Variable de instancia (campo) del método
 
    //Constructor
    public EntradaDeTeclado ()  {
        entradaTeclado="";
       } //Cierre del constructor
 
    public void pedirEntrada ()  {  //Método de la clase         
        Scanner entradaEscaner = new Scanner (System.in);
        entradaTeclado = entradaEscaner.nextLine();
    } //Cierre del método pedirEntrada

    public String getEntrada () {

        return entradaTeclado;

 } //Cierre del método getEntrada

} //Cierre de la clase



Codigo de la clase Pausar

Código: [Seleccionar]
import java.io.*;// Importar libreria para pausar pantalla.
/**
 * Pausar salida de datos poor pantalla y borrar pantalla
 *
 * @author (Pablo)
 * @version (0.0)
 */
public class Pausar
{
    // instance variables - replace the example below with your own
    private int x;

    /**
     * Constructor for objects of class Pausar
     */
    public Pausar()
    {
        // initialise instance variables
        x = 0;
    }

    public static void pause(){
        int  inChar;
        inChar=0;
        System.out.println("\nPulse Enter para continuar...");
        try {
            inChar = System.in.read();

        }
        catch (IOException e){
            System.out.println("Error reading from user");
        }
        System.out.print("\f");
    }
}


Gracias. ;)
« Última modificación: 07 de Agosto 2019, 18:49 por Ogramar »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Buenas, para quien revise este ejercicio, en líneas generales sigue lo pedido. Dejo algunos comentarios que pueden ser de interés:

- En el código propuesto hay algunos elementos con los que no se ha trabajado en el curso (como uso de java.io.* para pausar pantalla). Si se quiere ver una solución que se ciñe a los contenidos del curso puede consultarse https://aprenderaprogramar.com/foros/index.php?topic=1179.0

- Un aspecto a mejorar sería la forma de nombrar las clases. En lugar de nombrarse en plural, es preferible nombrarlas en singular. Hay nombres no adecuados como "Pausar". En este hilo se dan algunas indicaciones interesantes sobre cómo nombrar las clases en Java: https://aprenderaprogramar.com/foros/index.php?topic=3035.msg13698#msg13698

- Otro aspecto mejorable es que no se ha reutilizado código en todas sus posibilidades aprovechando las propiedades de la herencia Java. Si nos fijamos en cómo se muestra la información de los productos, para un producto fresco, se usa

Código: [Seleccionar]
System.out.print ("******DATOS EN PRODUCTOS FRESCOS******\n" +
            "Fecha de caducidad  : "+
            testProFresco.getFechaCaducidad()+

Y luego para un producto refrigerado, etc. prácticamente se repite el mismo código.

La repetición de código en general indica un mal diseño. En este caso, dado que tanto productos frescos como productos refrigerados tienen cosas en común, lo preferible hubiera sido tratarlo en común, evitando tener que repetir. Para entender a qué me refiero, recomiendo consultar https://aprenderaprogramar.com/foros/index.php?topic=1179.0 y ver el tratamiento que se da al método verInfoProducto(). Si nos fijamos, en las subclases se invoca el método de la superclase, evitando tener que repetir código.

Salu2

 

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