Buenas tardes, Mario.
Gracias por corregirme el ejercicio.
Creo que he entendido mal el ejercicio. Como el mismo indica:
Todos los productos llevan esta información común: fecha de caducidad y número de lote.
y:
Hay tres tipos de productos congelados: congelados por aire, congelados por agua y congelados por nitrógeno. Los productos congelados por aire deben llevar la información de la composición del aire con que fue congelado (% de nitrógeno, % de oxígeno, % de dióxido de carbono y % de vapor de agua). Los productos congelados por agua deben llevar la información de la salinidad del agua con que se realizó la congelación en gramos de sal por litro de agua. Los productos congelados por nitrógeno deben llevar la información del método de congelación empleado y del tiempo de exposición al nitrógeno expresada en segundos.
intepreté que los productos congelados por aire sólo tendrían que llevar la información: fecha de caducidad, número de lote y la composición del aire(nitrógeno, oxígeno, co2 y vapor de agua). Los productos congelados por agua tendrán que llevar la información: fecha de caducidad, número de lote y la salinidad. Y los productos congelados por nitrógeno: fecha de caducidad, número de lote y el tiempo de exposición al nitrógeno.
Por eso ví que lo más lógico era que todos los tipos de congelados por aire/agua/nitrógeno era más lógica que heredaran de la clase "Producto" y no de la clase "ProductoCongelado". Aunque también debo decir que si un producto congelado por aire/agua/nitrógeno debería llevar la información de su padre "ProductoCongelado". Pero como también dije anteriormente, pensé que si dichos productos (ProductoCongeladoPorAire/Agua/Nitrogeno) tendrían que llevar la información de su padre lo hubieran puesto en el ejercicio. Sí, reconozco, este tema es más bien de lógica que no de leer el cometido del ejercicio.
Sobre el apartado b) del ejercicio:
b) Crear superclases intermedias (aunque no se correspondan con la descripción dada de la empresa) para agrupar atributos y métodos cuando sea posible. Esto corresponde a “realizar abstracciones” en el ámbito de la programación, que pueden o no corresponderse con el mundo real.
no ví la necesidad de crear ninguna superclase intermedia porque realmente la clase "Producto" lleva la información que necesitan las subclases "ProductoFresco", "ProductoRefrigerado" y "ProductoCongelado" y a su vez la subclase "ProductoFresco" lleva, en sí, la información que necesitan las subclases "ProductoRefrigerado" y "ProductoCongelado". Por último, la subclase "ProductoRefrigerado" lleva la información que necesita la subclase "ProductoCongelado" (aquí cabe un matíz que lo expongo más abajo).
Así que, siguiendo esta lógica, sería de esperar que la subclase "ProductoCongelado" herede de la subclase "ProductoRefrigerados"(para la clase "ProductoCongelado" la clase "ProductoRefrigerado" es una superclase, pero para las clases con más nivel es una subclase). A su vez, la subclase "ProductoRefrigerado" herede de la subclase (su superclase) "ProductoFresco" y al final la subclase "ProductoFresco" herede de la superclase "Producto".
Sobre lo que había comentado antes que la subclase "ProductoCongelado" conlleva la misma información que su superclase "ProductoRefrigerado" eso no es del todo cierto. En el anunciado del ejercicio se comenta:
Los productos refrigerados deben llevar el código del organismo de supervisión alimentaria, la fecha de envasado, la temperatura de mantenimiento recomendada y el país de origen. Los productos congelados deben llevar la fecha de envasado, el país de origen y la temperatura de mantenimiento recomendada.
vemos que la subclase "ProductoCongelado" lleva un campo menos que su superclase "ProductoRefrigerado". Ese "dilema" le he resuelto con un constructor sobreescrito en la subclase "ProductoRefrigerado" como podemos ver a continuación en el código de la subclase "ProductoRefrigerado":
public ProductoRefrigerado(String fechaCaducidad, int numeroLote, String fechaEnvase, String paisOrigen, float temperaturaMantenemientoRecom){
super(fechaCaducidad, numeroLote, fechaEnvase, paisOrigen);
this.temperaturaMantenemientoRecom = temperaturaMantenemientoRecom;
}
public ProductoRefrigerado(String fechaCaducidad, int numeroLote, String fechaEnvase, String paisOrigen, int codigoOrganismoSupervision, float temperaturaMantenemientoRecom){
super(fechaCaducidad, numeroLote, fechaEnvase, paisOrigen);
this.codigoOrganismoSupervision = codigoOrganismoSupervision;
this.temperaturaMantenemientoRecom = temperaturaMantenemientoRecom;
}
vemos que el primer constructor no lleva el parámetro "codigoOrganismoSupervision" cosa que nos brinda la oportunidad de crear un constructor adecuado con el cometido del ejercicio en la subclase "ProductoCongelado":
public ProductoCongelado(String fechaCaducidad, int numeroLote, String fechaEnvase, String paisOrigen, float temperaturaMantenemientoRecom){
super(fechaCaducidad, numeroLote, fechaEnvase, paisOrigen, temperaturaMantenemientoRecom);
}
Creo que con esta aclaración se explica la falta de una superclase "intermedia" de productos.
Adjunto el esquema como "esquemaCU00687B(011).jpg".
De todas maneras, considerando las anotaciones por parte de Mario R. Rancel deberíamos modificar los códigos de las subclases: "ProductoCongeladoPorAire", "ProductoCongeladoPorAgua", "ProductoCongeladoPorNitrogeno" y "TestHerencia3" que quedarían de la siguiente manera:
El código de la subclase "ProductoCongeladoPorAgua":
public class ProductoCongeladoPorAgua extends ProductoCongelado{
private float salinidadAgua;
public ProductoCongeladoPorAgua(String fechaCaducidad, int numeroLote, String fechaEnvase, String paisOrigen, float temperaturaMantenemientoRecom ,float salinidadAgua){
super(fechaCaducidad, numeroLote, fechaEnvase, paisOrigen, temperaturaMantenemientoRecom);
this.salinidadAgua = salinidadAgua;
}
public void setSalinidadAgua(float salinidadAgua){
this.salinidadAgua = salinidadAgua;
}
public float getSalinidadAgua(){return salinidadAgua;}
public void mostrarInfoProductoCongeladoPorAgua(){
System.out.println("El producto: "+getNumeroLote()+" con fecha de caducidad: "+getFechaCaducidad()+" tiene un porcentaje de salinidad: "+getSalinidadAgua()+"gr sal por litro de agua");
}
}
El código de la subclase "ProductoCongeladoPorAire":
public class ProductoCongeladoPorAire extends ProductoCongelado{
private float nitrogeno;
private float oxigeno;
private float co2;
private float vaporAgua;
public ProductoCongeladoPorAire(String fechaCaducidad, int numeroLote, String fechaEnvase, String paisOrigen, float temperaturaMantenemientoRecom, float nitrogeno, float oxigeno, float co2, float vaporAgua){
super(fechaCaducidad, numeroLote, fechaEnvase, paisOrigen, temperaturaMantenemientoRecom);
this.nitrogeno = nitrogeno;
this.oxigeno = oxigeno;
this.co2 = co2;
this.vaporAgua = vaporAgua;
}
public void setNitrogeno(float nitrogeno){
this.nitrogeno = nitrogeno;
}
public void setOxigeno(float oxigeno){
this.oxigeno = oxigeno;
}
public void setCo2(float co2){
this.co2 = co2;
}
public void setVaporAgua(float vaporAgua){
this.vaporAgua = vaporAgua;
}
public float getNitrogeno(){return nitrogeno;}
public float getOxigeno(){return oxigeno;}
public float getCo2(){return co2;}
public float getVaporAgua(){return vaporAgua;}
public void mostrarInfoProductoCongeladoPorAire(){
System.out.println("El producto: "+getNumeroLote()+" con fecha de caducidad: "+getFechaCaducidad()+" tiene una composición de aire como sigue: ");
System.out.println("Nitrógeno: "+getNitrogeno()+"%");
System.out.println("Oxígeno: "+getOxigeno()+"%");
System.out.println("Dióxido de carbono: "+getCo2()+"%");
System.out.println("Vapor de agua: "+getVaporAgua()+"%");
}
}
El código de la subclase "ProductoCongeladoPorNitrogeno":
public class ProductoCongeladoPorNitrogeno extends ProductoCongelado{
private String metodoCongelacion;
private int tiempoExposicion;
public ProductoCongeladoPorNitrogeno(String fechaCaducidad, int numeroLote, String fechaEnvase, String paisOrigen, float temperaturaMantenemientoRecom, String metodoCongelacion, int tiempoExposicion){
super(fechaCaducidad, numeroLote, fechaEnvase, paisOrigen, temperaturaMantenemientoRecom);
this.metodoCongelacion = metodoCongelacion;
this.tiempoExposicion = tiempoExposicion;
}
public void setMetodoCongelacion(String metodoCongelacion){
this.metodoCongelacion = metodoCongelacion;
}
public void setTiempoExposicion(int tiempoExposicion){
this.tiempoExposicion = tiempoExposicion;
}
public String getMetodoCongelacion(){return metodoCongelacion;}
public int getTiempoExposicion(){return tiempoExposicion;}
public void mostrarInfoProductoCongeladoPorNitrogeno(){
System.out.println("El producto: "+getNumeroLote()+" con fecha de caducidad: "+getFechaCaducidad()+" tuvo un método de congelación: "+getMetodoCongelacion()+" y estuvo expuesto al nitrógeno: "+getTiempoExposicion()+"s");
}
}
Y el código de la clase main "TestHerencia3":
public class TestHerencia3{
public static void main(String []Args){
ProductoFresco productoFresco1 = new ProductoFresco("23-06-2016",1234, "05-01-2016","Argentina");
ProductoFresco productoFresco2 = new ProductoFresco("22-06-2016",987,"09-10-2016","España");
ProductoRefrigerado productoRefrigerado1 = new ProductoRefrigerado("10-10-2016",345,"01-03-2016","Ecuador",5);
ProductoRefrigerado productoRefrigerado2 = new ProductoRefrigerado("11-10-2016",346,"02-03-2016","Colombia",5);
ProductoRefrigerado productoRefrigerado3 = new ProductoRefrigerado("12-10-2016",347,"03-03-2016","Marruecos",5);
ProductoCongeladoPorAgua productoCongeladoPorAgua1 = new ProductoCongeladoPorAgua("13-06-2016",908,"12-05-2016","Estados Unidos",-21,40);
ProductoCongeladoPorAgua productoCongeladoPorAgua2 = new ProductoCongeladoPorAgua("13-08-2016",988,"13-05-2016","Francia",-18,35);
ProductoCongeladoPorAire productoCongeladoPorAire1 = new ProductoCongeladoPorAire("11-08-2016",354,"11-05-2016","Alemania",-19,20,20,30,30);
ProductoCongeladoPorAire productoCongeladoPorAire2 = new ProductoCongeladoPorAire("11-11-2016",428,"08-08-2016","Países Bajos",-15,10,20,30,40);
ProductoCongeladoPorNitrogeno productoCongeladoPorNitrogeno1 = new ProductoCongeladoPorNitrogeno("10-08-2016",846,"08-06-2016","Bolivia",-22,"Tradicional",200);
productoFresco1.mostrarInfoProductoFresco();
productoFresco2.mostrarInfoProductoFresco();
productoRefrigerado1.mostrarInfoProductoRefrigerado();
productoRefrigerado2.mostrarInfoProductoRefrigerado();
productoRefrigerado3.mostrarInfoProductoRefrigerado();
productoCongeladoPorAgua1.mostrarInfoProductoCongeladoPorAgua();
productoCongeladoPorAgua2.mostrarInfoProductoCongeladoPorAgua();
productoCongeladoPorAire1.mostrarInfoProductoCongeladoPorAire();
productoCongeladoPorAire2.mostrarInfoProductoCongeladoPorAire();
productoCongeladoPorNitrogeno1.mostrarInfoProductoCongeladoPorNitrogeno();
}
}
Adjunto el esquema de la modificación del ejercicio como "esquemaCU00687B(022)".
No sé si con esta constestación he resuelto el ejercicio y he comprendido mejor el mismo.
Gracias