Autor Tema: Definir esquema herencia simple Java extends y super Ejercicio resuelto CU00687B  (Leído 2551 veces)

PatAs

  • Sin experiencia
  • *
  • Mensajes: 19
  • ¿Libre...? - Solo cuando pienso y aprendo!!
    • Ver Perfil
Buenas tardes. Presento posible solución del ejercicio propuesto CU00687B del curso de fundamentos de programación Java. Por lo que pude leer en el foro estoy teniendo problemas a la hora de nombrar las clases, estoy abocado a mejorar sobre ese tema y varios mas sobre el aprendizaje. Cordial Saludo.

Código: [Seleccionar]
package CU00687B;
/**
 * La clase Producto centraliza los atributos y métodos comunes a todos los productos
 * que procesa la empresa
 * @author (Arnaldo R. Martinez)
 * @version (31-Jul-2017 - Ejercicio propuesto por 'aprenderaprogramar.com')
 */
 public class Producto {
private String fechaDeVencimiento;
private String numDeLote;
private String fechaDeEnvasado;
private String paisDeOrigen;
//Constructor general sin parametros.
public Producto(){
fechaDeVencimiento = "";
numDeLote = "";
fechaDeEnvasado = "";
paisDeOrigen = "";
}
//Constructor con parametros
public Producto(String fVto, String lote, String fEnv, String Origen) {
fechaDeVencimiento = fVto;
numDeLote = lote;
fechaDeEnvasado = fEnv;
paisDeOrigen = Origen;
}
//Métodos set
public void setVencimiento(String fechaDeVencimiento) {
this.fechaDeVencimiento = fechaDeVencimiento;
}
public void setNumLote(String numDeLote) {
this.numDeLote = numDeLote;
}
public void setEnvasado(String fechaDeEnvasado) {
this.fechaDeEnvasado = fechaDeEnvasado;
}
public void setOrigen(String paisDeOrigen) {
this.paisDeOrigen = paisDeOrigen;
}
//Métodos get
public String getVencimiento() {return fechaDeVencimiento;}
public String getNumLote() {return numDeLote;}
public String getEnvasado() {return fechaDeEnvasado;}
public String getOrigen() {return paisDeOrigen;}
}//Fin de la superclase

Código: [Seleccionar]
package CU00687B;
/**
 * La subclase 'ProductoFresco' es heredada de la superclase 'Producto'.
 *
 * @author (Arnaldo R. Martinez)
 * @version (31-Jul-2017 - Ejercicio propuesto por 'aprenderaprogramar.com')
 */
public class ProductoFresco extends Producto {

//Constructor
public ProductoFresco(){
super();
}
public ProductoFresco(String fVto, String lote, String fEnv, String Origen) {
super(fVto,lote,fEnv,Origen);
}//Cierre del constructor
//Método de la subclase
public void MostrarProductoFresco() {
System.out.println("El producto fresco " +getNumLote()+ " tiene fecha de vencimiento " +getVencimiento()+ "\nel origen es " +getOrigen()+ " y fue envasado el " +getEnvasado());
}
}//Cierre de la clase

Código: [Seleccionar]
package CU00687B;
/**
 * 'ClaseAuxiliar' es una subclase de la superclase 'Producto' y a la vez
 * es superclase de las clases 'ProductoRefrigerado' y 'ProductoCongelado'
 * maneja y muestra atributos de la temperatura de mantenimiento para los
 * productos que requieren tenerla controlada.
 * @author (Arnaldo R. Martinez)
 * @version (31-Jul-2017 - Ejercicio propuesto por 'aprenderaprogramar.com')
 */
public class ClaseAuxiliar extends Producto {
private float temperaturaDeMantenimiento;

public ClaseAuxiliar() {
super();
temperaturaDeMantenimiento = 0.0f;
}

public ClaseAuxiliar(String fVto, String lote, String fEnv, String Origen, float tempMant) {
super(fVto,lote,fEnv,Origen);
temperaturaDeMantenimiento = tempMant;
}
//Método set
public void setTemperatura(float temperaturaDeMantenimiento) {
this.temperaturaDeMantenimiento = temperaturaDeMantenimiento;
}
//Método get
public float getTemperatura() {return temperaturaDeMantenimiento;}
}

Código: [Seleccionar]
package CU00687B;
/**
 * 'ProductoRefrigerado' es heredada de 'ClaseAuxiliar' que q su vez hereda de 'Producto'.
 *
 * @author (Arnaldo R. Martinez)
 * @version (01-Ago-2017 - Ejercicio propuesto por 'aprenderaprogramar.com')
 */
public class ProductoRefrigerado extends ClaseAuxiliar {
private String codigoInspeccionOSA;
//Constructor general sin parámetros
public ProductoRefrigerado() {
super();
codigoInspeccionOSA = "";
}
//Constructor con parámetros
public ProductoRefrigerado(String fVto,String Lote, String fEnv, String Origen, float tempMant, String codOSA) {
super (fVto,Lote,fEnv,Origen,tempMant);
codigoInspeccionOSA = codOSA;
}
//Métodos de la clase.
public void setInspOSA(String codigoInspeccionOSA) { this.codigoInspeccionOSA = codigoInspeccionOSA;}

public String getInspOSA() {return codigoInspeccionOSA;}

public void MostrarProductoRefrigerado() {
System.out.println("El producto refrigerado " +getNumLote()+ " fue envasado el " +getEnvasado()+ "\ntiene fecha de vencimiento " +getVencimiento()+ " el certificado de inspeccion es: " +getInspOSA()+ "\nel origen es " +getOrigen()+ " y se recomienda mantener a una temperatura de " +getTemperatura()+ " °C");
}
}//Cierre de la clase.

Código: [Seleccionar]
package CU00687B;
/**
 * 'ProductoCongelado' es heredada de 'ClaseAuxiliar' que a su vez hereda de 'Producto'.
 * No presenta atributos propios ya que los mismos están definidos en las superclases de la misma
 * @author (Arnaldo R. Martinez)
 * @version (01-Ago-2017 - Ejercicio propuesto por 'aprenderaprogramar.com')
 */
public class ProductoCongelado extends ClaseAuxiliar {
//Constructor general sin parámetros.
    public ProductoCongelado() {
        super();
    }
    //Constructor con parámetros.
    public ProductoCongelado(String fVto, String Lote, String fEnv, String Origen, float tempMant) {
        super (fVto,Lote,fEnv,Origen,tempMant);
    }
    //Método de la clase.
//Presenta dudas si debe incluirse, ya que 'ProductoCongelado' tiene tres subclases y en cada una
//existe un método 'Mostrar()'
    public void MostrarProductoCongelado() {
        System.out.println("El producto congelado " +getNumLote()+ " fue envasado el " +getEnvasado()+ "\ntiene fecha de vencimiento " +getVencimiento()+ " el origen es " +getOrigen()+ "\ny se recomienda mantener a una temperatura de " +getTemperatura()+ " °C");
    }
}

Código: [Seleccionar]
package CU00687B;
/**
 * 'ProductoCongeladoPorAire' es subclase de 'ProductoCongelado'
 *
 * @author (Arnaldo R. Martinez)
 * @version (01-Ago-2017 - Ejercicio propuesto por 'aprenderaprogramar.com')
 */
public class ProductoCongeladoPorAire extends ProductoCongelado {
private float porcentajeNitrogeno;
private float porcentajeOxigeno;
private float porcentajeDioxidoDeCarbono;
private float porcentajeVaporDeAgua;
//Constructor general sin parámetros
public ProductoCongeladoPorAire() {
super();
porcentajeNitrogeno = 0.0f;
porcentajeOxigeno = 0.0f;
porcentajeDioxidoDeCarbono = 0.0f;
porcentajeVaporDeAgua = 0.0f;
}
//Constructos con parámetros
public ProductoCongeladoPorAire(String fVto,String lote,String fEnv,String Origen,float tempMant,float porcNi,float porcO2,float porcDC,float porcVA) {
super(fVto,lote,fEnv,Origen,tempMant);
porcentajeNitrogeno = porcNi;
porcentajeOxigeno = porcO2;
porcentajeDioxidoDeCarbono = porcDC;
porcentajeVaporDeAgua = porcVA;
}
//Métodos set
public void setNitrogeno(float porcentajeNitrogeno) {
this.porcentajeNitrogeno = porcentajeNitrogeno;
}
public void setOxigeno(float porcentajeOxigeno) {
this.porcentajeOxigeno = porcentajeOxigeno;
}
public void setDDC(float porcentajeDioxidoDeCarbono) {
this.porcentajeDioxidoDeCarbono = porcentajeDioxidoDeCarbono;
}
public void setVapor(float porcentajeVaporDeAgua) {
this.porcentajeVaporDeAgua = porcentajeVaporDeAgua;
}
//Métodos get
public float getNitrogeno() {return porcentajeNitrogeno;}
public float getOxigeno(){return porcentajeOxigeno;}
public float getDDC() {return porcentajeDioxidoDeCarbono;}
public float getVapor(){return porcentajeVaporDeAgua;}
//Otros métodos
public void MostrarComposicionAire() {
System.out.println("Composición del aire " +getNitrogeno()+ " %," +getOxigeno()+ " %," +getDDC()+ " %," +getVapor()+ "%.");
}

public void MostrarProductoCongeladoPorAire() {
System.out.println("El producto congelado " +getNumLote()+ " fue envasado el " +getEnvasado()+ "\ntiene fecha de vencimiento " +getVencimiento()+ " el origen es " +getOrigen()+ "\ny se recomienda mantener a una temperatura de " +getTemperatura()+ " °C.\nLa composicion del aire de congelacion es: Nitrogeno " +getNitrogeno()+ " %, \nOxigeno " +getOxigeno()+ " %, Dioxido de Carbono " +getDDC()+ " %, Vapor de agua " +getVapor()+ " %.");
}
}

Código: [Seleccionar]
package CU00687B;
/**
 * 'ProductoCongeladoPorAgua' es dubclase de 'ProductoCongelado'.
 *
 * @author (Arnaldo R. Martinez)
 * @version (01-Ago-2017 - Ejercicio propuesto por 'aprenderaprogramar.com')
 */
public class ProductoCongeladoPorAgua extends ProductoCongelado {
private float salinidadAgua;
//Cosntructor general sin parámetros.
public ProductoCongeladoPorAgua() {
super();
salinidadAgua = 0.0f;
}
//Constructor con parámetros
public ProductoCongeladoPorAgua(String fVto,String lote,String fEnv,String Origen,float tempMant,float salAgua) {
super(fVto,lote,fEnv,Origen,tempMant);
salinidadAgua = salAgua;
}//Cierre del constructor.

//Métodos de la subclase
public void setSalinidad(float salinidadAgua) {
this.salinidadAgua = salinidadAgua;

}
public float getSalinidad() {return salinidadAgua;}

public void MostrarProductoCongeladoPorAgua() {
System.out.println("El producto congelado " +getNumLote()+ " fue envasado el " +getEnvasado()+ "\ntiene fecha de vencimiento " +getVencimiento()+ " el origen es " +getOrigen()+ "\ny se recomienda mantener a una temperatura de " +getTemperatura()+ " °C.\nLa salinidad del agua de comgelación es de " + getSalinidad()+ " gr/litro.");
}
}//Cierre de la clase

Código: [Seleccionar]
package CU00687B;
/**
 * 'ProductoCongeladoPorNitrogeno' hereda de 'ProductoCongelado'.
 *
 * @author (Arnaldo R. Martinez)
 * @version (01-Ago-2017 - Ejercicio propuesto por 'aprenderaprogramar.com')
 */
public class ProductoCongeladoPorNitrogeno extends ProductoCongelado {
private String metodoCongelador;
private int tiempoExposicioSegundos;
//Constructor general sin parámetros
public ProductoCongeladoPorNitrogeno() {
super();
metodoCongelador = "";
tiempoExposicioSegundos = 0;
}
//Constructor con parámetros.
public ProductoCongeladoPorNitrogeno(String fVto,String lote,String fEnv,String Origen,float tempMant,String metCong,int tSeg) {
super(fVto,lote,fEnv,Origen,tempMant);
metodoCongelador = metCong;
tiempoExposicioSegundos = tSeg;
}
//Métodos set
public void setMetodoCongelador(String metodoCongelador) {
this.metodoCongelador = metodoCongelador;
}
public void setTiempoExposicion(int tiempoExposicioSegundos) {
this.tiempoExposicioSegundos = tiempoExposicioSegundos;
}
//Métodos get
public String getMetodoCongelador() {return metodoCongelador;}
public int getTiempoExposicion() {return tiempoExposicioSegundos;}
//Otro método
public void MostrarProductoCongeladoPorNitrogeno(){
System.out.println("El producto congelado " +getNumLote()+ " fue envasado el " +getEnvasado()+ "\ntiene fecha de vencimiento " +getVencimiento()+ " el origen es " +getOrigen()+ "\ny se recomienda mantener a una temperatura de " +getTemperatura()+ " °C.\nEl metodo de congelación por Nitrogeno es por " +getMetodoCongelador()+ ",\nel tiempo de exposicion es de " +getTiempoExposicion()+ " segundos.");
}
}

Código: [Seleccionar]
package CU00687B;
/**
 * TestHerencia3. Se crean 2 productos frescos, 3 refrigerados y 5 congelados,
 * de los últimos (2 congelados por agua, 2 por aire y 1 por nitrógeno).
 * @author (Arnaldo R. Martinez)
 * @version (01-Ago-2017 - Ejercicio propuesto por 'aprenderaprogramar.com')
 */
public class TestHerencia3 {
public static void main (String [] Args) {
ProductoFresco pfresco1 = new ProductoFresco("12-08-2017","FR1001","30-07-2017","Argentina");
ProductoFresco pfresco2 = new ProductoFresco("25-07-2017","FR1002","25-07-2017","Brasil");
ProductoRefrigerado prefrig1 = new ProductoRefrigerado("30-08-2017","RF1003","20-07-2017","Bolivia",2.0f,"AR-5004");
ProductoRefrigerado prefrig2 = new ProductoRefrigerado("05-09-2017","RF1004","20-07-2017","Brasil",3.5f,"AR-5005");
ProductoRefrigerado prefrig3 = new ProductoRefrigerado("15-09-2017","RF1005","20-07-2017","Chile",1.5f,"AR-5006");
ProductoCongeladoPorAgua pcongagua1 = new ProductoCongeladoPorAgua("12-06-2017","CAG1006","30-12-2017","Alemania",-18.0f,35.0f);
ProductoCongeladoPorAgua pcongagua2 = new ProductoCongeladoPorAgua("12-06-2017","CAG1007","30-12-2017","Francia",-15.5f,55.5f);
ProductoCongeladoPorAire pcongaire1 = new ProductoCongeladoPorAire("12-06-2017","CAI1008","30-12-2017","España",-12.0f,70.0f,19.0f,2.0f,8.0f);
ProductoCongeladoPorAire pcongaire2 = new ProductoCongeladoPorAire("12-06-2017","CAI1009","30-12-2017","Italia",-22.3f,70.5f,19.5f,2.0f,7.0f);
ProductoCongeladoPorNitrogeno pcongnitro1 = new ProductoCongeladoPorNitrogeno("12-06-2017","CAI1010","30-12-2017","Argentina",-25.3f,"Inmersion",7);
//Se muestran resultados.
pfresco1.MostrarProductoFresco();
System.out.println("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
pfresco2.MostrarProductoFresco();
System.out.println("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
prefrig1.MostrarProductoRefrigerado();
System.out.println("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
prefrig2.MostrarProductoRefrigerado();
System.out.println("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
prefrig3.MostrarProductoRefrigerado();
System.out.println("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
pcongagua1.MostrarProductoCongeladoPorAgua();
System.out.println("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
pcongagua2.MostrarProductoCongeladoPorAgua();
System.out.println("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
pcongaire1.MostrarProductoCongeladoPorAire();
System.out.println("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
pcongaire2.MostrarProductoCongeladoPorAire();
System.out.println("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
pcongnitro1.MostrarProductoCongeladoPorNitrogeno();
System.out.println("xxxxxxxxxxxxxxx fin del programa xxxxxxxxxxxxxxxxxxxxxxx");
}
}
« Última modificación: 18 de Agosto 2017, 19:40 por Alex Rodríguez »

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Hola PatAs, la solución que has propuesto está bien planteada en líneas generales.

Los nombres de las clases no están demasiado mal. La única observación que te hago sobre los nombres de clases es que un nombre como ClaseAuxiliar resulta bastante pobre, en el sentido de que no es descriptivo de qué representa la clase. Sería más adecuado un nombre descriptivo.

En cuanto al esquema de herencia, hay algunas cosas que deberías mejorar. Por ejemplo:

- Si la clase Producto tiene ciertos atributos, sería lógico que dentro de esta clase tuvieras un método public void MostrarProducto() y luego reutilizar ese código en las clases que hereden de Producto. Una idea clave en la herencia es reutilizar código de clases superiores en las clases inferiores.

Fíjate por ejemplo en lo planteado aquí: https://www.aprenderaprogramar.com/foros/index.php?topic=2377.0

Ahí puedes ver en la clase Producto un método public void imprimirInfo()

Luego ese método se invoca en clases inferiores como     

public void imprimirDatos(){
        System.out.println("Codigo de Supervision Alimentaria: " + getCodigoSupervisionAlimentaria());
        imprimirInfo();       
    }

Ves que imprimirInfo() permite reutilizar el código en clases inferiores. Tú sin embargo repites el código (contrario a la idea de reutilización)

Es bueno consultar otros hilos del foro y ver otras ideas y comentarios

Saludos

PatAs

  • Sin experiencia
  • *
  • Mensajes: 19
  • ¿Libre...? - Solo cuando pienso y aprendo!!
    • Ver Perfil
Entendido. Estuve mirando lo sugerido y me parece que no tengo que hacer muchos cambios. Todavía debo fijar conceptos sobre herencia por lo que reescribiré el código a ver si lo logro.
Muchas gracias.

 

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