Autor Tema: Ejercicio resuelto herencia en Java CU00686B. Ejemplo de superclases y subclases  (Leído 4485 veces)

RaGa

  • Moderador Global
  • Intermedio
  • *******
  • APR2.COM
  • Mensajes: 234
    • Ver Perfil
Mi versión del Ejercicio propuesto en la Entrega Nº86. Ejercicio CU00686B.

El código corre y hace lo que se pretende. Sin embargo -además de las observaciones que me harán- tengo una duda respecto a lo siguiente:

Dentro de la clase TestHerencia2 está el método main, y otros dos métodos. La incorporación de estos dos métodos es lo que "me hace ruido" en cuanto a la filosofía de la POO, ya que la clase GestionTipoProducto modifica campos del método main a través de esos dos métodos.

Hubiera preferido no tener que incluirlos pero me es inevitable a la hora de: no repetir código, y no declarar los campos (tmpString y tmpInt) como públicos.


Clase Producto

Código: [Seleccionar]
/**
 * Clase Producto.
 *
 * @author (RaGa)
 * @version (20150407)
 */
public class Producto
{
    // Declaración de campos de instancia.
    private String fechaDeCaducidad;
    private int nroLote;

    /**
     * Constructor de la clase Producto.
     *
     * Se iniciliza con dos parámetros:
     * fechaDeCaducidad (tipo String) que es la fecha de caducidad del producto.
     * nroLote (tipo int) que es el número de lote al que corresponde el producto.
     */
    public Producto(String fechaDeCaducidad, int nroLote){
        this.fechaDeCaducidad = fechaDeCaducidad;
        this.nroLote = nroLote;
    } // fin del constructor
   
//SETTERS//
   
    /**
     * Método setFechaDeCaducidad
     * Establece la fecha de caducidad del producto.
     *
     * @param fechaDeCaducidad representa la fecha de caducidad del producto.
     */
    public void setFechaDeCaducidad(String fechaDeCaducidad){this.fechaDeCaducidad = fechaDeCaducidad;}
   
    /**
     * Método setNroLote
     * Establece el número de lote del producto.
     *
     * @param nroLote representa el número de lote del producto.
     */
    public void setNroLote(int nroLote){this.nroLote = nroLote;}
   
//GETTERS// 
   
    /**
     * Método getFechaDeCaducidad
     * El método devuelve la fecha de caducidad del producto.
     *
     * @return retorna la fecha de caducidad del producto.
     */
    public String getFechaDeCaducidad(){return fechaDeCaducidad;}
   
    /**
     * Método getNroLote
     * El método devuelve el número de lote del producto.
     *
     * @return retorna el número de lote del producto.
     */
    public int getNroLote(){return nroLote;}
   
// MÉTODOS VARIOS //   

    /**
     * Método mostrarFechaDeCaducidad
     *
     * El método muestra la fecha de caducidad del producto.
     */
    public void mostrarFechaDeCaducidad(){System.out.print(fechaDeCaducidad+"\n");}
   
     /**
     * Método mostrarNroLote
     *
     * El método muestra el numero de lote del producto.
     */
    public void mostrarNroLote(){System.out.print(nroLote+"\n");}
   
   
   
}  // find e la clase


Clase ProductoFresco

Código: [Seleccionar]
/**
 * Clase ProductoFresco
 *
 * @author (RaGa)
 * @version (20150407)
 */
public class ProductoFresco extends Producto
{
    // Declaración de campos de instancia.
    private String fechaEnvasado;
    private String paisDeOrigen;   

    /**
     * Constructor de la clase ProductoFresco
     *
     * Se debe pasar como parámetro los campos de la superclase Producto.
     * Los campos específicos de esta clase son:
     * fechaEnvasado que representa la fecha de envasado del producto fresco (tipo String) y se inicializa como "desconocida".
     * paisDeOrigen que representa el país de origen del producto fresco (tipo String) y se inicializa como "desconocido".
     */
    public ProductoFresco(String fechaDeCaducidad, int nroLote){
        super (fechaDeCaducidad,nroLote);
        fechaEnvasado = "desconocida";
        paisDeOrigen = "desconocido";
    } // fin del constructor

//SETTERS//

    /**
     * Método setFechaEnvasado
     * Establece la fecha de envasado del producto fresco.
     *
     * @param representa la fecha de envasado del producto fresco.
     */
    public void setFechaEnvasado(String fechaEnvasado){this.fechaEnvasado = fechaEnvasado;}
   
     /**
     * Método setPaisDeOrigen
     * Establece el pais de origen del producto fresco.
     *
     * @param representa el pais de origen del producto fresco.
     */
    public void setPaisDeOrigen(String paisDeOrigen){this.paisDeOrigen = paisDeOrigen;}
   
//GETTERS// 
   
    /**
     * Método getFechaEnvasado
     * El método devuelve la fecha de envase del producto fresco.
     *
     * @return retorna la fecha de envase del producto fresco.
     */
    public String getFechaEnvasado(){return fechaEnvasado;}
   
     /**
     * Método getPaisDeOrigen
     * El método devuelve el pais de origen del producto fresco.
     *
     * @return retorna el pais de origen del producto fresco.
     */
    public String getPaisDeOrigen(){return paisDeOrigen;}
   
   
// MÉTODOS VARIOS //   

    /**
     * Método mostrarFechaEnvasado
     *
     * El método muestra la fecha de envasado del producto fresco.
     */
    public void mostrarFechaEnvasado(){System.out.print(fechaEnvasado+"\n");}

    /**
     * Método mostrarPaisDeOrigen
     *
     * El método muestra el pais de origen del producto fresco.
     */
    public void mostrarPaisDeOrigen(){System.out.print(paisDeOrigen+"\n");}
   
} // fin de la clase


Clase ProductoRefrigerado

Código: [Seleccionar]
/**
 * Clase ProductoRefrigerado
 *
 * @author (RaGa)
 * @version (20150407)
 */
public class ProductoRefrigerado extends Producto
{
    // Declaración de campos de instancia.
    private String codigoOSA;

    /**
     * Constructor de la clase ProductoRefrigerado
     *
     * Se debe pasar como parámetro los campos de la superclase Producto.
     * El campos específico de esta clase es:
     * codigoOSA que representa el código del organismo de supervisión alimentaria del producto refrigerado (tipo String) y se inicializa como "desconocido".
     */
    public ProductoRefrigerado(String fechaDeCaducidad, int nroLote){
        super (fechaDeCaducidad,nroLote);
        codigoOSA = "desconocido";
    } // fin del constructor

//SETTERS//

    /**
     * Método setCodigoOSA
     * Establece el código del organismo de supervisión alimentaria.
     *
     * @param representa el código del organismo de supervisión alimentaria.
     */
    public void setCodigoOSA(String codigoOSA){this.codigoOSA = codigoOSA;}
   
//GETTERS// 
   
    /**
     * Método getCodigoOSA
     * El método devuelve el código del organismo de supervisión alimentaria.
     *
     * @return retorna el código del organismo de supervisión alimentaria.
     */
    public String getCodigoOSA(){return codigoOSA;}
   
   
// MÉTODOS VARIOS //   

    /**
     * Método mostrarCodigoOSA
     *
     * El método muestra el código del organismo de supervisión alimentaria.
     */
    public void mostrarCodigoOSA(){System.out.print(codigoOSA+"\n");}   
   
} // fin de la clase


Clase ProductoCongelado

Código: [Seleccionar]
/**
 * Clase ProductoCongelado
 *
 * @author (RaGa)
 * @version (20150408)
 */
public class ProductoCongelado extends Producto
{
    // Declaración de campos de instancia.
    private int tempCongelacionRecomendada;
   
    /**
     * Constructor de la clase ProductoCongelado
     *
     * Se debe pasar como parámetro los campos de la superclase Producto.
     * El campo específico de esta clase es:
     * tempCongelacionRecomendada que representa la temperatura de congelación recomendada (tipo int) y se inicializa como -500.
     */


    public ProductoCongelado(String fechaDeCaducidad, int nroLote){
        super (fechaDeCaducidad,nroLote);
        tempCongelacionRecomendada = -500;
    } // fin del constructor

//SETTERS//

    /**
     * Método setFechaEnvasado
     * Establece la temperatura de congelación recomendada.
     *
     * @param representa la temperatura de congelación recomendada.
     */
    public void setTempCongelacionRecomendada(int tempCongelacionRecomendada){this.tempCongelacionRecomendada = tempCongelacionRecomendada;}
   
//GETTERS// 
   
    /**
     * Método getTempCongelacionRecomendada
     * El método devuelve la temperatura de congelacion recomendada.
     *
     * @return retorna la temperatura de congelacion recomendada.
     */
    public int getTempCongelacionRecomendada(){return tempCongelacionRecomendada;}

   
// MÉTODOS VARIOS //   

    /**
     * Método mostrarTempCongelacionRecomendada
     *
     * El método muestra la temperatura de congelacion recomendada.
     */
    public void mostrarTempCongelacionRecomendada(){System.out.print(tempCongelacionRecomendada);}     

   
} // fin de la clase


Clase TestHerencia2

Código: [Seleccionar]

/**
 * Clase TestHerencia2.
 * Esta clase sirve para probar nuestro incipiente incursión en el tema Herencia de Java.
 *
 * @author (RaGa)
 * @version (20150408)
 */
public class TestHerencia2{
   
    // Declaración de campos de instancia
    static String tmpFechaDeCaducidad;
    static int tmpNroLote;


    /**
     * Constructor de la clase TestHerencia2 vacío.
     */
    public TestHerencia2(){
    }

    /**
     * Método main.
     */
    public static void main (String[] args){
        // Declaración de los campos de clase
        String tmpString;
        int tmpInt;

//CARGA DE PRODUCTOS       
        System.out.print("\fBienvenido a la carga de Productos Alimenticios!\n");
        //Carga de un Producto Fresco
        Exibidor.mostrarEncabezadoProductoTipo("Fresco");
        GestorTipoProducto.pedirCampos();
        ProductoFresco miProductoFresco = new ProductoFresco(tmpFechaDeCaducidad,tmpNroLote);
        System.out.println("Por favor ingrese la fecha de envasado:");
        miProductoFresco.setFechaEnvasado(GestionadorEntradasTeclado.leerString());
        System.out.println("Por favor ingrese el país de origen del producto:");
        miProductoFresco.setPaisDeOrigen(GestionadorEntradasTeclado.leerString());
 
        //Carga de un Producto Refrigerado
        Exibidor.mostrarEncabezadoProductoTipo("Refrigerado");
        GestorTipoProducto.pedirCampos();
        ProductoRefrigerado miProductoRefrigerado = new ProductoRefrigerado(tmpFechaDeCaducidad,tmpNroLote);
        System.out.println("Por favor ingrese el Código del organismo de supervisión alimentaria:");
        miProductoRefrigerado.setCodigoOSA(GestionadorEntradasTeclado.leerString());
       
        //Carga de un Producto Congelado
        Exibidor.mostrarEncabezadoProductoTipo("Congelado");
        GestorTipoProducto.pedirCampos();
        ProductoCongelado miProductoCongelado = new ProductoCongelado(tmpFechaDeCaducidad,tmpNroLote);
        System.out.println("Por favor ingrese la temperatura de congelación recomendada:");
        miProductoCongelado.setTempCongelacionRecomendada(GestionadorEntradasTeclado.leerInt());

// MUESTRA DE PRODUCTOS CARGADOS
        System.out.println("\fProductos Alimenticios cargados por el sistema");
       
        //Muestra del Producto Fresco cargado
        Exibidor.mostarRotuloProductoTipo("Fresco");
        System.out.print("Fecha de caducidad: "); miProductoFresco.mostrarFechaDeCaducidad();
        System.out.print("Nro.de Lote: "); miProductoFresco.mostrarNroLote();
        System.out.print("Fecha de Envasado: "); miProductoFresco.mostrarFechaEnvasado();
        System.out.print("País de Origen: "); miProductoFresco.mostrarPaisDeOrigen();
       
       
        //Muestra del Producto Refrigerado cargado
        Exibidor.mostarRotuloProductoTipo("Refrigerado");
        System.out.print("Fecha de caducidad: "); miProductoRefrigerado.mostrarFechaDeCaducidad();
        System.out.print("Nro.de Lote: "); miProductoRefrigerado.mostrarNroLote();
        System.out.print("Código del organismo de supervisión alimentaria: "); miProductoRefrigerado.mostrarCodigoOSA();

        //Muestra del Producto Congelado cargado
        Exibidor.mostarRotuloProductoTipo("Congelado");
        System.out.print("Fecha de caducidad: "); miProductoCongelado.mostrarFechaDeCaducidad();
        System.out.print("Nro.de Lote: "); miProductoCongelado.mostrarNroLote();
        System.out.print("Temperatura de congelación recomendada: "); miProductoCongelado.mostrarTempCongelacionRecomendada();
       
    } // fin método main
   
   

     /**
     * Método cargarFechaCaducidadTipoProducto.
     * Sirve para cargar el campo tmpFechaDeCaducidad el cual servirá como parámetro para inicilizar un producto.
     *
     * @param Recibe como parámetro un String con la fecha de caducidad del producto.
     */
   
    public static void cargarFechaCaducidadTipoProducto(String valorTmpFechaDeCaducidad){
        tmpFechaDeCaducidad = valorTmpFechaDeCaducidad;
    }
   
     /**
     * Método cargarNroLoteTipoProducto.
     * Sirve para cargar el campo tmpNroLote el cual servirá como parámetro para inicilizar un producto.
     *
     * @param Recibe como parámetro un int con el numero de lote del producto.
     */
   
    public static void cargarNroLoteTipoProducto(int valorTmpNroLote){
        tmpNroLote = valorTmpNroLote;
    }   
   

   
} // fin de la clase


Clase GestorTipoProducto

Código: [Seleccionar]
/**
 * Clase GestorTipoProducto.
 *
 * Esta clase sirve para gestionar los parámetros necesarios para inicilizar un objeto tipo Producto.
 *
 * @author (RaGa)
 * @version (20150408)
 */
public class GestorTipoProducto{
   
    /**
    * Método pedirCampos.
    *
    * Esta método sirve para pedir al Usuario ingrese por Teclado los
    * parámetro que necesita el Constructor de la clase Producto.
    *
    */
    public static void pedirCampos(){
        System.out.println("Por favor ingrese la fecha de caducidad:");
        TestHerencia2.cargarFechaCaducidadTipoProducto(GestionadorEntradasTeclado.leerString());
        System.out.println("Por favor ingrese el número de lote:");
        TestHerencia2.cargarNroLoteTipoProducto(GestionadorEntradasTeclado.leerInt());
    } //fin de método

   
} // fin de clase


Clase Exibidor

Código: [Seleccionar]
/**
 * Clase Exibidor.
 *
 * Esta clase sirve mostrar datos por consola.
 *
 * @author (RaGa)
 * @version (20150408)
 */
public class Exibidor{
   
    /**
    * Método mostrarEncabezadoProductoTipo.
    *
    * Esta método sirve para mostrar el encabezado al momento de la carga de los productos.
    *
    * @param El parámetro de entrada corresponde al tipo de producto que se cargara (Congelado, Refrigerado, o Fresco). Este parámetro tipo String es el que se mostrará por consola.
    *
    */
    public static void mostrarEncabezadoProductoTipo(String tipoDeProducto){
        System.out.print("------------------------------------------------\n");
        System.out.print("");
        System.out.println("A continuación se cargará un Producto "+tipoDeProducto+"...");
        System.out.println("");
    } //fin de método
   
    /**
    * Método mostarRotuloProductoTipo.
    *
    * Esta método muestra por consola un encabezado donde se indica el tipo de Producto.
    *
    * @param El parámetro corresponde al tipo de producto (Congelado, Refrigerado, o Fresco).
    *
    */
    public static void mostarRotuloProductoTipo(String tipoDeProducto){
        System.out.println("------------------------------------------------\n");
        System.out.println("[ Producto "+tipoDeProducto+" ]");
        System.out.println("");
    } // fin de método 
   
   
} // fin de clase


Clase GestionadorEntradasTeclado

Código: [Seleccionar]
import java.util.Scanner;

/**Esta clase sirve para leer los valores ingresados por el usuario a través del teclado. Cuenta con dos métodos estáticos tipo función: uno devuelve un objeto tipo String ingresado por el usuario a través del teclado, y el otro devuelve un valor tipo int ingresado por el usuario a través del teclado.
 * @author: RaGa
 * @date: 15/03/15
 * @version: 01
 */

public class GestionadorEntradasTeclado{
    //Declaracion de campos de instancia de la clase vacío.
   
    public GestionadorEntradasTeclado(){ // Constructor de clase vacío.
    }
   
    /**Devuelve un objeto tipo String que corrsponde al valor ingresado por el usuario a través del teclado.
     * @return retorna un objeto tipo String.
     */
     public static String leerString(){
        Scanner scannerTeclado = new Scanner (System.in);
        String valorTeclado = scannerTeclado.nextLine();
        return valorTeclado;
    }
   
    /**Devuelve un valor tipo int que corresponde al valor ingresado por el usuario a través del teclado.
    * @return retorna un valor tipo int.
    */
    public static int leerInt(){
       Scanner scannerTeclado = new Scanner (System.in);
       int valorTeclado = scannerTeclado.nextInt();
       String valorTmp = scannerTeclado.nextLine(); // para vaciar el buffer.
       return valorTeclado;
    }
     
} // Fin de la clase


« Última modificación: 14 de Abril 2015, 08:40 por Alex Rodríguez »

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Hola RaGa: de la misma manera que se ha hecho en otros hilos, indicarte que este tipo de métodos

public void mostrarPaisDeOrigen(){System.out.print(paisDeOrigen+"\n");}

deberías de empezar a dejar de usarlos. En cambio deberías usar:

public String getPaisDeOrigen(){return ""+paisDeOrigen+"\n");}

Es decir, que el método devuelva un String. En la clase con el main, ya te encargarías de gestionar que se muestre por pantalla.

Tu clase TestHerencia2 es mejorable.

¿Para qué necesitas estos atributos en esta clase:

    static String tmpFechaDeCaducidad;
    static int tmpNroLote;

?

Esos atributos deben ser gestionados por la clase que le corresponda, no por la clase con el método main.


Con la clase GestorTipoProducto creo que te has hecho un pequeño lío:

TestHerencia2.cargarFechaCaducidadTipoProducto(GestionadorEntradasTeclado.leerString());

Esto es lo que se puede llamar código ofuscado: un código complicado con numerosas entrellamadas y difícil de entender (algo que no se debe utilizar).

Puedes mirar este ejercicio como ejemplo de solución: https://www.aprenderaprogramar.com/foros/index.php?topic=2306

Y te recomendaría revisar el diseño teniendo en cuenta lo siguiente: cada clase tiene sus responsabilidades, entre ellas gestionar sus atributos. Y la clase con el main únicamente tiene que encargarse de digirir la operación e interacción entre objetos, nada más.

Saludos

RaGa

  • Moderador Global
  • Intermedio
  • *******
  • APR2.COM
  • Mensajes: 234
    • Ver Perfil
Re:Ejercicio resuelto CU00686B. Implementación de herencia en Java.
« Respuesta #2 en: 10 de Abril 2015, 21:26 »
Citar
Tu clase TestHerencia2 es mejorable.

¿Para qué necesitas estos atributos en esta clase:

    static String tmpFechaDeCaducidad;
    static int tmpNroLote;

?

En la clase TestHerencia2, estos atributos son las variables que se pasarán como parámetros a la hora de crear un nuevo producto. Corresponden a los campos de la superclase.
La pretención es no repetir código cada vez que se quiere instanciar un nuevo producto de una subclase.

De todos modos lo que estaba haciendo yo era: modificacar estos 2 atributos no con un método de la propia clase (TestHerencia2), sino desde métodos de otra clase (GestorTipoProducto), ¡grave error!.

¿Qué voy a hacer entonces?
1.- Eliminaré la clase GestorTipoProducto
2.- Integraré en la clase TestHerencia2 los métodos necesarios para instanciar cualquiera de los productos -manteniendo así la coherencia- y también eliminar de esta forma el código ofuscado.
3.- De la misma manera seguiré la recomendación que los métodos gets de los distintos productos retornen un String y no que el mismo método realice la impresión por consola.

Reescribo las clases para su evaluación. Muchas gracias!

Clase Producto
Código: [Seleccionar]
/**
 * Clase Producto.
 *
 * @author (RaGa)
 * @version (20150410)
 */
public class Producto
{
    // Declaración de campos de instancia.
    private String fechaDeCaducidad;
    private int nroLote;

    /**
     * Constructor de la clase Producto.
     *
     * Se iniciliza con dos parámetros:
     * fechaDeCaducidad (tipo String) que es la fecha de caducidad del producto.
     * nroLote (tipo int) que es el número de lote al que corresponde el producto.
     */
    public Producto(String fechaDeCaducidad, int nroLote){
        this.fechaDeCaducidad = fechaDeCaducidad;
        this.nroLote = nroLote;
    } // fin del constructor
   
//SETTERS//
   
    /**
     * Método setFechaDeCaducidad
     * Establece la fecha de caducidad del producto.
     *
     * @param fechaDeCaducidad representa la fecha de caducidad del producto.
     */
    public void setFechaDeCaducidad(String fechaDeCaducidad){this.fechaDeCaducidad = fechaDeCaducidad;}
   
    /**
     * Método setNroLote
     * Establece el número de lote del producto.
     *
     * @param nroLote representa el número de lote del producto.
     */
    public void setNroLote(int nroLote){this.nroLote = nroLote;}
   
//GETTERS// 
   
    /**
     * Método getFechaDeCaducidad
     * El método devuelve la fecha de caducidad del producto.
     *
     * @return retorna la fecha de caducidad del producto.
     */
    public String getFechaDeCaducidad(){return (""+fechaDeCaducidad+"\n");}
   
    /**
     * Método getNroLote
     * El método devuelve el número de lote del producto.
     *
     * @return retorna el número de lote del producto.
     */
    public String getNroLote(){return (""+nroLote+"\n");}
   
   
}  // find e la clase

Clase ProductoFresco
Código: [Seleccionar]
/**
 * Clase ProductoFresco
 *
 * @author (RaGa)
 * @version (20150410)
 */
public class ProductoFresco extends Producto
{
    // Declaración de campos de instancia.
    private String fechaEnvasado;
    private String paisDeOrigen;   

    /**
     * Constructor de la clase ProductoFresco
     *
     * Se debe pasar como parámetro los campos de la superclase Producto.
     * Los campos específicos de esta clase son:
     * fechaEnvasado que representa la fecha de envasado del producto fresco (tipo String) y se inicializa como "desconocida".
     * paisDeOrigen que representa el país de origen del producto fresco (tipo String) y se inicializa como "desconocido".
     */
    public ProductoFresco(String fechaDeCaducidad, int nroLote){
        super (fechaDeCaducidad,nroLote);
        fechaEnvasado = "desconocida";
        paisDeOrigen = "desconocido";
    } // fin del constructor

//SETTERS//

    /**
     * Método setFechaEnvasado
     * Establece la fecha de envasado del producto fresco.
     *
     * @param representa la fecha de envasado del producto fresco.
     */
    public void setFechaEnvasado(String fechaEnvasado){this.fechaEnvasado = fechaEnvasado;}
   
     /**
     * Método setPaisDeOrigen
     * Establece el pais de origen del producto fresco.
     *
     * @param representa el pais de origen del producto fresco.
     */
    public void setPaisDeOrigen(String paisDeOrigen){this.paisDeOrigen = paisDeOrigen;}
   
//GETTERS// 
   
    /**
     * Método getFechaEnvasado
     * El método devuelve la fecha de envase del producto fresco.
     *
     * @return retorna la fecha de envase del producto fresco.
     */
    public String getFechaEnvasado(){return (""+fechaEnvasado+"\n");}
   
     /**
     * Método getPaisDeOrigen
     * El método devuelve el pais de origen del producto fresco.
     *
     * @return retorna el pais de origen del producto fresco.
     */
    public String getPaisDeOrigen(){return (""+paisDeOrigen+"\n");}
   
   
} // fin de la clase

Clase ProductoRefrigerado
Código: [Seleccionar]
/**
 * Clase ProductoRefrigerado
 *
 * @author (RaGa)
 * @version (20150410)
 */
public class ProductoRefrigerado extends Producto
{
    // Declaración de campos de instancia.
    private String codigoOSA;

    /**
     * Constructor de la clase ProductoRefrigerado
     *
     * Se debe pasar como parámetro los campos de la superclase Producto.
     * El campos específico de esta clase es:
     * codigoOSA que representa el código del organismo de supervisión alimentaria del producto refrigerado (tipo String) y se inicializa como "desconocido".
     */
    public ProductoRefrigerado(String fechaDeCaducidad, int nroLote){
        super (fechaDeCaducidad,nroLote);
        codigoOSA = "desconocido";
    } // fin del constructor

//SETTERS//

    /**
     * Método setCodigoOSA
     * Establece el código del organismo de supervisión alimentaria.
     *
     * @param representa el código del organismo de supervisión alimentaria.
     */
    public void setCodigoOSA(String codigoOSA){this.codigoOSA = codigoOSA;}
   
//GETTERS// 
   
    /**
     * Método getCodigoOSA
     * El método devuelve el código del organismo de supervisión alimentaria.
     *
     * @return retorna el código del organismo de supervisión alimentaria.
     */
    public String getCodigoOSA(){return (""+codigoOSA+"\n");}
 
   
} // fin de la clase

Clase ProductoCongelado
Código: [Seleccionar]
/**
 * Clase ProductoCongelado
 *
 * @author (RaGa)
 * @version (20150410)
 */
public class ProductoCongelado extends Producto
{
    // Declaración de campos de instancia.
    private int tempCongelacionRecomendada;
   
    /**
     * Constructor de la clase ProductoCongelado
     *
     * Se debe pasar como parámetro los campos de la superclase Producto.
     * El campo específico de esta clase es:
     * tempCongelacionRecomendada que representa la temperatura de congelación recomendada (tipo int) y se inicializa como -500.
     */


    public ProductoCongelado(String fechaDeCaducidad, int nroLote){
        super (fechaDeCaducidad,nroLote);
        tempCongelacionRecomendada = -500;
    } // fin del constructor

//SETTERS//

    /**
     * Método setFechaEnvasado
     * Establece la temperatura de congelación recomendada.
     *
     * @param representa la temperatura de congelación recomendada.
     */
    public void setTempCongelacionRecomendada(int tempCongelacionRecomendada){this.tempCongelacionRecomendada = tempCongelacionRecomendada;}
   
//GETTERS// 
   
    /**
     * Método getTempCongelacionRecomendada
     * El método devuelve la temperatura de congelacion recomendada.
     *
     * @return retorna la temperatura de congelacion recomendada.
     */
    public String getTempCongelacionRecomendada(){return (""+tempCongelacionRecomendada+"\n");}

   
} // fin de la clase

Clase TestHerencia2
Código: [Seleccionar]

/**
 * Clase TestHerencia2.
 * Esta clase sirve para probar nuestro incipiente incursión en el tema Herencia de Java.
 *
 * @author (RaGa)
 * @version (20150410)
 */
public class TestHerencia2{
   
    // Declaración de campos de instancia
    static String tmpFechaDeCaducidad;
    static int tmpNroLote;


    /**
     * Constructor de la clase TestHerencia2 vacío.
     */
    public TestHerencia2(){
    }

    /**
     * Método main.
     */
    public static void main (String[] args){
        // Declaración de los campos de clase
//        String tmpString;
//        int tmpInt;

//CARGA DE PRODUCTOS       
        System.out.print("\fBienvenido a la carga de Productos Alimenticios!\n");
        //Creación de un Producto Fresco
        Exibidor.mostrarEncabezadoProductoTipo("Fresco");
        pedirCamposTipoProducto();
        ProductoFresco miProductoFresco = new ProductoFresco(tmpFechaDeCaducidad,tmpNroLote);
        System.out.println("Por favor ingrese la fecha de envasado:");
        miProductoFresco.setFechaEnvasado(GestionadorEntradasTeclado.leerString());
        System.out.println("Por favor ingrese el país de origen del producto:");
        miProductoFresco.setPaisDeOrigen(GestionadorEntradasTeclado.leerString());
 
        //Creación de un Producto Refrigerado
        Exibidor.mostrarEncabezadoProductoTipo("Refrigerado");
        pedirCamposTipoProducto();
        ProductoRefrigerado miProductoRefrigerado = new ProductoRefrigerado(tmpFechaDeCaducidad,tmpNroLote);
        System.out.println("Por favor ingrese el Código del organismo de supervisión alimentaria:");
        miProductoRefrigerado.setCodigoOSA(GestionadorEntradasTeclado.leerString());
       
        //Creación de un Producto Congelado
        Exibidor.mostrarEncabezadoProductoTipo("Congelado");
        pedirCamposTipoProducto();
        ProductoCongelado miProductoCongelado = new ProductoCongelado(tmpFechaDeCaducidad,tmpNroLote);
        System.out.println("Por favor ingrese la temperatura de congelación recomendada:");
        miProductoCongelado.setTempCongelacionRecomendada(GestionadorEntradasTeclado.leerInt());

// MUESTRA DE PRODUCTOS CARGADOS
        System.out.println("\fProductos Alimenticios cargados por el sistema");
       
        //Muestra del Producto Fresco creado
        Exibidor.mostarRotuloProductoTipo("Fresco");
        System.out.print("Fecha de caducidad: ");
        System.out.print(miProductoFresco.getFechaDeCaducidad());
        System.out.print("Nro.de Lote: ");
        System.out.print(miProductoFresco.getNroLote());
        System.out.print("Fecha de Envasado: ");
        System.out.print(miProductoFresco.getFechaEnvasado());
        System.out.print("País de Origen: ");
        System.out.print(miProductoFresco.getPaisDeOrigen());
       
       
        //Muestra del Producto Refrigerado creado
        Exibidor.mostarRotuloProductoTipo("Refrigerado");
        System.out.print("Fecha de caducidad: ");
        System.out.print(miProductoRefrigerado.getFechaDeCaducidad());
        System.out.print("Nro.de Lote: ");
        System.out.print(miProductoRefrigerado.getNroLote());
        System.out.print("Código del organismo de supervisión alimentaria: ");
        System.out.print(miProductoRefrigerado.getCodigoOSA());
       
        //Muestra del Producto Congelado creado
        Exibidor.mostarRotuloProductoTipo("Congelado");
        System.out.print("Fecha de caducidad: ");
        System.out.print(miProductoCongelado.getFechaDeCaducidad());
        System.out.print("Nro.de Lote: ");
        System.out.print(miProductoCongelado.getNroLote());
        System.out.print("Temperatura de congelación recomendada: ");
        System.out.print(miProductoCongelado.getTempCongelacionRecomendada());
       
    } // fin método main
   

    /**
    * Método pedirCamposTipoProducto.
    *
    * Este método sirve para pedir al Usuario ingrese por Teclado los
    * parámetro que necesita el Constructor de la clase Producto.
    *
    */
    private static void pedirCamposTipoProducto(){
        System.out.println("Por favor ingrese la fecha de caducidad:");
        tmpFechaDeCaducidad = GestionadorEntradasTeclado.leerString();
        System.out.println("Por favor ingrese el número de lote:");
        tmpNroLote = GestionadorEntradasTeclado.leerInt();
    } //fin de método
   
} // fin de la clase

Clase Exibidor
Código: [Seleccionar]
/**
 * Clase Exibidor.
 *
 * Esta clase sirve mostrar datos por consola.
 *
 * @author (RaGa)
 * @version (20150408)
 */
public class Exibidor{
   
    /**
    * Método mostrarEncabezadoProductoTipo.
    *
    * Esta método sirve para mostrar el encabezado al momento de la carga de los productos.
    *
    * @param El parámetro de entrada corresponde al tipo de producto que se cargara (Congelado, Refrigerado, o Fresco). Este parámetro tipo String es el que se mostrará por consola.
    *
    */
    public static void mostrarEncabezadoProductoTipo(String tipoDeProducto){
        System.out.print("------------------------------------------------\n");
        System.out.print("");
        System.out.println("A continuación se cargará un Producto "+tipoDeProducto+"...");
        System.out.println("");
    } //fin de método
   
    /**
    * Método mostarRotuloProductoTipo.
    *
    * Esta método muestra por consola un encabezado donde se indica el tipo de Producto.
    *
    * @param El parámetro corresponde al tipo de producto (Congelado, Refrigerado, o Fresco).
    *
    */
    public static void mostarRotuloProductoTipo(String tipoDeProducto){
        System.out.println("------------------------------------------------\n");
        System.out.println("[ Producto "+tipoDeProducto+" ]");
        System.out.println("");
    } // fin de método 
   
   
} // fin de clase

Clase GestionadorEntradasTeclado
Código: [Seleccionar]
import java.util.Scanner;

/**Esta clase sirve para leer los valores ingresados por el usuario a través del teclado. Cuenta con dos métodos estáticos tipo función: uno devuelve un objeto tipo String ingresado por el usuario a través del teclado, y el otro devuelve un valor tipo int ingresado por el usuario a través del teclado.
 * @author: RaGa
 * @date: 15/03/15
 * @version: 01
 */

public class GestionadorEntradasTeclado{
    //Declaracion de campos de instancia de la clase vacío.
   
    public GestionadorEntradasTeclado(){ // Constructor de clase vacío.
    }
   
    /**Devuelve un objeto tipo String que corrsponde al valor ingresado por el usuario a través del teclado.
     * @return retorna un objeto tipo String.
     */
     public static String leerString(){
        Scanner scannerTeclado = new Scanner (System.in);
        String valorTeclado = scannerTeclado.nextLine();
        return valorTeclado;
    }
   
    /**Devuelve un valor tipo int que corresponde al valor ingresado por el usuario a través del teclado.
    * @return retorna un valor tipo int.
    */
    public static int leerInt(){
       Scanner scannerTeclado = new Scanner (System.in);
       int valorTeclado = scannerTeclado.nextInt();
       String valorTmp = scannerTeclado.nextLine(); // para vaciar el buffer.
       return valorTeclado;
    }
     
} // Fin de la clase

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:Ejercicio resuelto CU00686B. Implementación de herencia en Java.
« Respuesta #3 en: 12 de Abril 2015, 12:15 »
Hola, ahora bastante mejor pero te insisto en que estos atributos no deberían de estar ahí:

    // Declaración de campos de instancia
    static String tmpFechaDeCaducidad;
    static int tmpNroLote;

Porque no son información que deba ir en esa clase. Si necesitas definir un String o un int, hazlo dentro del método main como variables temporales, no como variables de clase.

Saludos.

RaGa

  • Moderador Global
  • Intermedio
  • *******
  • APR2.COM
  • Mensajes: 234
    • Ver Perfil
Re:Ejercicio resuelto CU00686B. Implementación de herencia en Java.
« Respuesta #4 en: 12 de Abril 2015, 14:20 »
Perfecto Alex. Claro, no corresponden a atributos de instancia, no me daba cuenta de ello. Ya mismo modifico eso.
Muchas gracias por dedicar tu tiempo en estas correcciones, me ayudan mucho!

 

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