Autor Tema: Ejercicio resuelto Java Herencia, Polimorfismo, variables polimórficas CU00688B  (Leído 5281 veces)

el_calderas

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 43
    • Ver Perfil
Hola, Esta es mi solución para este ejercicio.

He utilizado todo el codigo del ejercicio anterior, sin modificarlo, añadiendo las clases que pide el ejercicio.

En el main, se puede añadir un array para guardar los distintos envios que se creen pero no lo he implementado asi ya que tampoco lo veo necesario....me he atenido a lo que pide el ejercicio.

Estas son las clases nuevas:


EnvioDeProductos:

Código: [Seleccionar]
import java.util.ArrayList;
import java.util.List;
import java.util.Iterator;

public class EnvioDeProductos
{
    private static int nEnvio=0;
    private Integer nProductos;
    private List<Producto> envio;
   
    public EnvioDeProductos(){
        envio=new ArrayList<Producto>();
        nEnvio++;
        nProductos=0;
    }
   
       
    public void addProductoAlEnvio(Producto p){
        envio.add(p);
        nProductos++;
    }
   
    public Integer getCantidadproductos(){
        return nProductos;
    }
       
    public void contenidoEnvio(){
        Iterator <Producto> it=envio.iterator();
        Producto p;
        while(it.hasNext()){
            p=it.next();
            System.out.println(p);
        }
    }
           
   
}


TestHerencia4:


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

public class TestHerencia4
{
   public static void main(String[] args){
        //se crea una lista para contener todos los productos
        ArrayList<Producto> listaProductos=new ArrayList<Producto>();
               
        //se crean los productos
       
        //parametros del fresco
        //String fechaCaducidad, int numeroLote,String paisOrigen, String fechaEnvasado
        //Crear 2
        Fresco productoFresco1 = new Fresco("12/2/16", 565, "España", "1/1/16");
        listaProductos.add(productoFresco1);
        Fresco productoFresco2 = new Fresco("12/5/18", 456, "España", "1/5/15");
        listaProductos.add(productoFresco2);
        //parametros del refrigerado:
        //String fechaCaducidad, int numeroLote,String paisOrigen, String fechaEnvasado, double temperaturaMantenimiento, String codigo
        //crear 3
        Refrigerado productoRefrigerado1 = new Refrigerado("12/8/18", 2300,"España", "13/5/14", 4, "B35-267");
        listaProductos.add(productoRefrigerado1);
        Refrigerado productoRefrigerado2 = new Refrigerado("12/8/17", 2385,"España", "7/3/15", 5, "Z85-29");
        listaProductos.add(productoRefrigerado2);
        Refrigerado productoRefrigerado3 = new Refrigerado("1/3/16", 123,"España", "4/1/15", -1, "T3-45");
        listaProductos.add(productoRefrigerado3);
        //parametros del congelado por aire
        //String fechaCaducidad, int numeroLote, String paisOrigen, String fechaEnvasado, double temperaturaMantenimiento, String composiciónAire
        //composición del aire: %nitrogeno,%oxigeno,%dioxido de carbono,%vapor de agua
        //crear 2
        Congelado congeladoAire1 = new CongeladoAire("12/8/18", 2300,"España", "13/5/14", -25.0,"Nitrogeno:78%%,Oxigeno:21%%,Dioxido de carbono:0,03%%,Vapor de agua:variable");
        listaProductos.add(congeladoAire1);
        Congelado congeladoAire2 = new CongeladoAire("12/8/16", 4524,"España", "10/11/14", -25.0,"Nitrogeno:78%%,Oxigeno:21%%,Dioxido de carbono:0,03%%,Vapor de agua:variable");
        listaProductos.add(congeladoAire2);
        //parametros congelado por agua
        //String fechaCaducidad, int numeroLote, String paisOrigen, String fechaEnvasado, double temperaturaMantenimiento, String salinidadAgua
        //salinidad del agua: gr/litro
        //crear 2
        Congelado congeladoAgua1 = new CongeladoAgua("1/3/15", 56,"España", "1/3/16", -20.0,"<0,5g/l");
        listaProductos.add(congeladoAgua1);
        Congelado congeladoAgua2 = new CongeladoAgua("12/2/15", 89,"España", "12/2/16", -20.0,"<0,5g/l");
        listaProductos.add(congeladoAgua2);
        //parametros congelado por nitrogeno
        //String fechaCaducidad, int numeroLote, String paisOrigen, String fechaEnvasado, double temperaturaMantenimiento, String metodoCongelacion,int tiempoExposicion
        //crear 1
        Congelado congeladoNitrogeno = new CongeladoNitrogeno("1/3/15", 32,"España", "1/3/16", -30.0,"Tunel de refrigeración",300);
        listaProductos.add(congeladoNitrogeno);
       
        //se crea un envio y se añaden los productos al envio
        EnvioDeProductos envio = new EnvioDeProductos();
        for(Producto p : listaProductos){
            envio.addProductoAlEnvio(p);
        }
       
       
        //Se imprime la información del envio
        System.out.println("Número de productos en el envio: " + envio.getCantidadproductos());
        System.out.println("Información de los productos contenidos en el envio: ");
        envio.contenidoEnvio();
    }
}


Y el resto de clases reutilizadas:

clase Producto:


Código: [Seleccionar]
public class Producto
{
    private String fechaCaducidad;
    private int numeroLote;
    private String paisOrigen;
    private String fechaEnvasado;
   
    public Producto(String fechaCaducidad, int numeroLote, String paisOrigen, String fechaEnvasado){
        this.fechaCaducidad=fechaCaducidad;
        this.numeroLote=numeroLote;
        this.paisOrigen=paisOrigen;
        this.fechaEnvasado=fechaEnvasado;
    }
   
    public String getFechaCaducidad(){
        return fechaCaducidad;
    }
   
    public int getNumeroLote(){
        return numeroLote;
    }
   
    public void setFechaCducidad(String fecha){
        fechaCaducidad=fecha;
    }
   
    public void setNumeroLote(int numero){
        numeroLote=numero;
    }
   
    public String getPaisOrigen(){
        return paisOrigen;
    }
   
    public String getFechaEnvasado(){
        return fechaEnvasado;
    }
   
    public void setPaisOrigen(String paisOrigen){
        this.paisOrigen=paisOrigen;
    }
   
    public void setFechaEnvasado(String fechaEnvasado){
        this.fechaEnvasado=fechaEnvasado;
    }
   
    @Override
    public String toString(){
        return String.format("Fecha de Caducidad: " + fechaCaducidad + "\n" +
        "Número de lote: " + numeroLote + "\n" +
        "Pais de origen: " + this.paisOrigen +"\n" +
        "Fecha de envasado: " + this.fechaEnvasado +"\n");
    }
}


Clase Fresco

Código: [Seleccionar]
public class Fresco extends Producto
{
    //esta clase no tiene atributos propios, los tiene la superclase
   
   
    public Fresco(String fechaCaducidad, int numeroLote,String paisOrigen, String fechaEnvasado){
        super(fechaCaducidad,numeroLote,paisOrigen,fechaEnvasado);
       
    }
   
   
   
    @Override
    public String toString(){
        return String.format("Información del producto fresco: \n" + super. toString());
    }
}


Clase congelado:

Código: [Seleccionar]
public class Congelado extends Producto
{
    //información generica
    private double temperaturaMantenimiento;
   
    public Congelado(String fechaCaducidad, int numeroLote, String paisOrigen, String fechaEnvasado, double temperaturaMantenimiento){
        super(fechaCaducidad,numeroLote,paisOrigen,fechaEnvasado);
        this.temperaturaMantenimiento=temperaturaMantenimiento;
    }
   
    public double getTemperaturaMantenimiento(){
        return temperaturaMantenimiento;
    }
   
    public void setTemperaturaMantenimiento(double temperaturaMantenimiento){
        this.temperaturaMantenimiento=temperaturaMantenimiento;
    }
   
    @Override
    public String toString(){
        return String.format(super. toString() +
        "Temperatura de mantenimiento: " + this.temperaturaMantenimiento + "ºC" + "\n");
    }
}


clase refrigerado:

Código: [Seleccionar]
public class Refrigerado extends Congelado
{
   //información especifica
   private String codigo;
   
   public Refrigerado(String fechaCaducidad, int numeroLote,String paisOrigen, String fechaEnvasado, double temperaturaMantenimiento, String codigo){
       super(fechaCaducidad,numeroLote,paisOrigen,fechaEnvasado,temperaturaMantenimiento);
       this.codigo=codigo;
    }
   
    public String getCodigo(){
        return codigo;
    }
   
    public void setCodigo(String codigo){
        this.codigo=codigo;
    }
   
    @Override
    public String toString(){
        return String.format("Información del producto refrigerado: \n" +
        super. toString() +
        "Codigo OSA: " + this.codigo +"\n" );
    }
}


Clase congelado por aire:

Código: [Seleccionar]
public class CongeladoAire extends Congelado
{
    private String composiciónAire;
   
    public CongeladoAire(String fechaCaducidad, int numeroLote, String paisOrigen, String fechaEnvasado, double temperaturaMantenimiento, String composiciónAire){
        super(fechaCaducidad, numeroLote, paisOrigen, fechaEnvasado,temperaturaMantenimiento);
        this.composiciónAire=composiciónAire;
    }
   
    public void setComposiciónAire(String composiciónAire){
        this.composiciónAire=composiciónAire;
    }
   
    public String getComposiciónAire(){
        return this.composiciónAire;
    }
       
   
    @Override
    public String toString(){
        return String.format("Información del producto congelado por aire: \n"+
        super.toString() +
        "Composición de aire: " + this.composiciónAire + "\n");
    }
   
}


clase congelado por agua:


Código: [Seleccionar]
public class CongeladoAgua extends Congelado
{
    private String salinidadAgua;
   
    public CongeladoAgua(String fechaCaducidad, int numeroLote, String paisOrigen, String fechaEnvasado, double temperaturaMantenimiento, String salinidadAgua){
        super(fechaCaducidad, numeroLote, paisOrigen, fechaEnvasado,temperaturaMantenimiento);
        this.salinidadAgua=salinidadAgua;
    }
   
    public void setSalinidadAgua(String salinidadAgua){
        this.salinidadAgua=salinidadAgua;
    }
   
    public String getSalinidadAgua(){
        return this.salinidadAgua;
    }
   
    @Override
    public String toString(){
        return String.format("Información del producto congelado por agua: \n"+
        super. toString() +
        "Salinidad del agua: " + this.salinidadAgua + "\n");
    }
       
}


clase congelado por nitrogeno:

Código: [Seleccionar]
public class CongeladoNitrogeno extends Congelado
{
    private String metodoCongelacion;
    private int tiempoExposicion;
   
    public CongeladoNitrogeno(String fechaCaducidad, int numeroLote, String paisOrigen, String fechaEnvasado, double temperaturaMantenimiento, String metodoCongelacion,int tiempoExposicion){
        super(fechaCaducidad, numeroLote, paisOrigen, fechaEnvasado,temperaturaMantenimiento);
        this.metodoCongelacion=metodoCongelacion;
        this.tiempoExposicion=tiempoExposicion;
    }
   
    @Override
    public String toString(){
        return String.format("Información del producto congelado por nitrogeno: \n"+
        super. toString() +
        "Metodo de congelación: " + this.metodoCongelacion + "\n" +
        "Tiempo de exposición al nitrogeno: " + this.tiempoExposicion + " segundos");
    }
       
}

Un saludo y gracias.
« Última modificación: 16 de Julio 2015, 13:09 por Alex Rodríguez »

Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Hola calderas, este ejercicio es un poco laborioso y en líneas generales lo veo bien trabajado. Las relaciones de herencia, la sobreescritura del método toString, uso de invocaciones a super, etc. están bien planteadas.

Voy a comentar algunas cuestiones que espero te sean útiles:

- Los nombres de las clases tienen cierta importancia, deben ser descriptivos y seguir un patrón lógico. En el caso de Congelado veo que sigues un patrón: la superclase es Congelado y las subclases CongeladoAgua, CongeladoAire y CongeladoNitrogeno por su propio nombre nos describen que son subclases y en cierta medida el nombre nos da una explicación.

Sin embargo no ocurre lo mismo entre Productos y sus subclases. Por ejemplo hubiera visto mejor que Producto fuera superclase y ProdCongelado, ProdFresco, etc. sus subclases, al menos de esta forma hay cierta indicación de herencia en el propio nombre de las clases.

- La clase Refrigerado veo que has hecho que herede de Congelado pero esto no sería correcto desde el punto de vista conceptual. Incluso si te supone un ahorro de código, el diseño de clases no debe (en la medida de lo posible) contravenir el modelado conceptual del mundo real. En programación orientada a objetos se dice que la relación de herencia genera una especialización de modo que podemos decir que la subclase "es un" tipo especializado de la superclase. Por ejemplo un producto congelado por aire "es un" producto congelado. Sin embargo un producto refrigerado no "es un" producto congelado. Aunque el código esté bien, a nivel de diseño no es consistente y debería ser mejorado.

- El atributo nProductos en la clase EnvioDeProductos parece que no resulta necesario. Esta información parece que ya se mantiene por el uso de la clase ArrayList que te provee del método size() que te devuelve el número de elementos en la lista. Si este es el único fin, no tendría sentido crear un atributo adicional para hacer algo que ya nos facilita el propio api de java.

Hay algo interesante para quien tenga interés que es el atributo estático nEnvio, que permite contar el número de envíos que se han creado (número de objetos envío, contados cada vez que se invoca el constructor).

Saludos

el_calderas

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 43
    • Ver Perfil
Primero, perdon por tardar tanto en responder, pero he estado separado del ordenador bastante tiempo....
Retomo las practicas ahora.
gracias por los consejos y las correcciones. En cuanto a los nombres, todavia cometo esos fallos al identificar las clases. Sigo trabajando en ello...
En cuanto a la clase refrigerado, tienes razon en que conceptualmente no es correcto, pero aun asi, lo hice de esta forma ya que en el enunciado del ejercicio decia:

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

Pense que se referia a esto. Tendre en cuenta lo que dices a partir de ahora.
El atributo nPrdoductos, en esta caso, sobra...
Y el atributo nEnvio me parecio necesario, por lo menos, incluirlo, aunque no se use.

Lo dicho, muchas gracias por la ayuda.

Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Gracias por responder, a veces no se sabe si se han leído o no los mensajes. Animo y a seguir adelante. 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".