Autor Tema: Diferencia entre polimorfismo y herencia Java programación orientada ob CU00688B  (Leído 1915 veces)

paramonso

  • Intermedio
  • ***
  • Mensajes: 241
  • El ignorante afirma, el sabio duda y reflexiona.
    • Ver Perfil
Hola. Dejo el Ejercicio. CU00688B del curso de programación básica Java de aprenderaprogramar. Entrega: Concepto de polimorfismo y variables polimórficas en Java. Jerarquía de tipos.

Modulo de la clase TestHerencia4.
Código: [Seleccionar]
/**
 *Modulo de la clase TestHerencia4.
 * Esta clase crea los objetos y los llena de datos.
 * Crea una lista de envio y la llena con los datos de la clase Productos.
 * Luego llama al modulo de la clase EnvioDeProductos
 * @author (paramonso)
 * @version (ver.1 // 11/11/2018)
 */

public class TestHerencia4
{   

    public static void main (String [] args){
        //Variable para separar listados
        String separador = new String(new char[125]).replace("\0", "*");
        //Crear lista de envios
        EnvioDeProductos listaEnvioProductos=new EnvioDeProductos();
        //Crear los objetos
        ProductoFresco productoFrescoA = new ProductoFresco("Patatas","15-1-2019","PA25421",5,"12-4-2018","España"); 
        ProductoFresco productoFrescoB = new ProductoFresco("Cebollas","15-2-2019","CE25325",5,"12-5-2018","Francia"); 

        ProductoRefrigerado productoRefrigradoA = new ProductoRefrigerado ("Merluza","15-10-2019","AS26453",1,"OSA2020" );
        ProductoRefrigerado productoRefrigradoB = new ProductoRefrigerado ("Sardinas","22-01-2019","AS26454",1,"OSA2018" );
        ProductoRefrigerado productoRefrigradoC = new ProductoRefrigerado ("Mejillon","12-06-2019","AS26455",1,"OSA2032" );

        CongeladoPorAgua productoPorAguaA = new CongeladoPorAgua ("Patata Prefrita","15-02-2021","AS25953",5,-25,5);
        CongeladoPorAgua productoPorAguaB = new CongeladoPorAgua ("Cebolla Cortada","18-12-2021","AS25965",5,-25,5);
       
        CongeladoPorAire productoPorAireA = new CongeladoPorAire ("Sepia Extra","15-11-2025","AS25853",-15,-25,5,8,12,25);
        CongeladoPorAire productoPorAireB = new CongeladoPorAire ("Anillas Calamar","15-11-2025","AS25853",-15,-25,5,8,12,25);
       
        CongeladoPorNitrogeno productoPorNitroA = new CongeladoPorNitrogeno ("Helado Fresa","15-12-2025","AS25453",5,-25,"Comprimido",5);
        //Añadir a la lista
        listaEnvioProductos.addListaEnvio(productoFrescoA);listaEnvioProductos.addListaEnvio(productoFrescoB);
       
        listaEnvioProductos.addListaEnvio(productoRefrigradoA);listaEnvioProductos.addListaEnvio(productoRefrigradoB);
        listaEnvioProductos.addListaEnvio(productoRefrigradoC);
       
        listaEnvioProductos.addListaEnvio(productoPorAguaA);listaEnvioProductos.addListaEnvio(productoPorAguaB);
       
        listaEnvioProductos.addListaEnvio(productoPorAireA);listaEnvioProductos.addListaEnvio(productoPorAireB);
        listaEnvioProductos.addListaEnvio(productoPorNitroA);
        //Presentar el tamaño de la lista
        System.out.println("Número de productos en el envio: "+listaEnvioProductos.getListaProductos().size());
       
        // Presentar en pantalla los productos de la lista
        listaEnvioProductos.mostrarDatosEnvio();
    }

}


Modulo de la Clase EnvioDeProductos.
Código: [Seleccionar]
/**
 *  Modulo de la clase EnvioDeProductos.
 *  En esta clase se crea la lista y se llena con los productos.
 *
 * @author (paramonso)
 * @version (ver.1 // 11/11/2018)
 */
import java.util.*;
public class EnvioDeProductos
{
    private LinkedList<Productos> listaProductos;
    public EnvioDeProductos()
    {
        listaProductos = new LinkedList<Productos>();
    }

    public LinkedList getListaProductos(){return listaProductos;}

    public void setListaProductos(LinkedList listaProductos){this.listaProductos=listaProductos;}

    public   LinkedList addListaEnvio(Productos producto){
        listaProductos.add(producto);
        return listaProductos;
    }
/**  Aqui esta el iterator para llamar a las demas clases atraves de la clase Productos,
 *  en la cual se produce el polimorfismo en el procedimiento presentarDatos().
 *  Al llevar todas las clases el procedimiento presentarDatos() en Productos datos=it.next se copia la clase
 *  que contiene los datos la lista y al llamar a dato.presentarDatos() se produce el polimorfismo.??????
 */
    public void mostrarDatosEnvio(){
        Iterator <Productos> it = listaProductos.iterator();
        int i=1;
        while(it.hasNext()){
            Productos dato = it.next();
            System.out.println ("PRODUCTO Nº : "+i);
            dato.presentarDatos();
            String separador = new String(new char[125]).replace("\0", "*");
            System.out.println ( separador);
            i++;
        }
    }
}


Modulo de la clase Productos
Código: [Seleccionar]
/**
 * Modulo de la clase Productos
 *Gestión de una empresa agroalimentaria que
 *trabaja con tres tipos de productos: productos frescos,
 *productos refrigerados y productos congelados (Congelados por agua,Congelados por Arie, Congelados por Nitrogeno).
 *
 * @author  Pablo Ramón Pérez Blasco "paramonso"
 * @version (1.0 - 11/11/2018)
 */
public class Productos
{
    // instance variables - replace the example below with your own
    public String nombre;
    public String fechaCaducidad;
    public String numeroLote;

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

   

    public String getNombre() {return nombre; }
     
    public String getFechaCaducidad() { return fechaCaducidad; }

    public String getNumeroLote(){return numeroLote;}

    public void setNombre  (String nombre) {
        this.nombre = nombre;
    }
   
    public void setFechaCaducidad  (String fechaCaducidad ) {
        this.fechaCaducidad = fechaCaducidad;
    } //Cierre del metodo
   
    public void setNumeroLote  (String numeroLote ) {
        this.numeroLote = numeroLote;
    } //
   
    //POLIMORFISMO presentarDatos()
     public void presentarDatos(){
     String datos="PRODUCTO\n"; 
     datos=datos+"Nombre: " + getNombre() + " Fecha de Caducidad: " + getFechaCaducidad()  +
      "Nº Lote: " + getNumeroLote();
      System.out.println(datos);
    }
}


SubClase TemperaturaManteni  de la SuperClase Productos
Código: [Seleccionar]
/**
 * SubClase TemperaturaManteni  de la SuperClase Productos
 * Temperatura de mantenimiento de los productos Frescos, Refrigerados y Congelados
 * @author (Pablo Ramón Pérez Blasco "paramonso")
 * @version (1.0 - 11/11/2018)
 *
 *
 */
public class TemperatManteni extends Productos
{
    public int tempMant  ;
   /**
     * Constructor para los objetos de la clase ProductosFrescos
     */
    public TemperatManteni(String nombre,String fechaCaducidad,String numeroLote,int tempMant)
    { super(nombre,fechaCaducidad ,numeroLote);
        this. tempMant =  tempMant;
         
    }
    public int getTempMant() { return  tempMant; }
    public void setTempMant  (int tempMant) {
        this. tempMant =  tempMant;
    } //Cierre del metodo
 //POLIMORFISMO presentarDatos()
     public void presentarDatos(){
     String datos="TEMPERATURA MANTENIMIENTO\n"; 
     datos=datos+"Temperatura Mantenimiento : " + getTempMant()+"ºC";
      System.out.println(datos);
    }
}


SubClase  ProductoFresco extends TemperatManteni de la SuperClase Productos
Código: [Seleccionar]

/**
 * SubClase productos frescos de la SuperClase Productos
 * @author (Pablo Ramón Pérez Blasco "paramonso")
 * @version (1.0 - 11/11/2018)
 */
public class ProductoFresco extends TemperatManteni
{
    public String fechaEnvasado;
    public String paisOrigen;

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

    public String getFechaEnvasado() { return fechaEnvasado; }
    public String getPaisOrigen(){return paisOrigen;}
    public void setFechaEnvasado  ( ) {
        this.fechaEnvasado = fechaEnvasado;
    } //Cierre del metodo
    public void setPaisOrigen  ( ) {
        this.paisOrigen = paisOrigen;
    } //
    //POLIMORFISMO presentarDatos()
    public void presentarDatos() {
        String datos="PRODUCTOS FRESCOS\n";
        datos=datos+"Nombre Producto: "+this.nombre+" | "+
        "Fecha Caducidad : "+this.getFechaCaducidad()+" | "+
        "Nº Lote : "+this.getNumeroLote()+" | "+
        "Tem.Mant. : "+this. getTempMant()+"ºC | "+
        "F.Envasado :"+ this.getFechaEnvasado()+" | "+
        "Pais Origen : "+ this.getPaisOrigen()+"\n";   
          System.out.print(datos);
    }
}




SubClase Productos Refrigerados de la SuperClase Productos  .
Código: [Seleccionar]
/**
 *  SubClase Productos Refrigerados de la SuperClase Productos  .
 * @author (Pablo Ramón Pérez Blasco "paramonso")
 * @version (1.0 - 11/11/2018)
 */
public class ProductoRefrigerado extends TemperatManteni
{
    public String  codigoOSA; //codigoOSA ==> codigo Organismo Supervision Alimentaria

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

    }

   

    public String getCodigoOSA() { return codigoOSA; }

    public void setCodigoOSA  (String codogoOSA ) {
        this.codigoOSA = codigoOSA;
    } //Cierre del método
//POLIMORFISMO presentarDatos()
    public void presentarDatos()  {
        String datos="PRODUCTOS REFRIGERADOS\n";
        datos=datos+"Nombre Producto: "+this.nombre+" | "+
        "Fecha Caducidad : "+this.getFechaCaducidad()+" | "+
        "Nº Lote : "+this.getNumeroLote()+" | "+
        "Tem.Mant. : "+this. getTempMant()+"ºC | "+
        "Codigo OSA:"+ this.getCodigoOSA()+"\n";
         System.out.print(datos);
    }
}


SubClase Productos Congelados de la SuperClase Productos
Código: [Seleccionar]
/**
 *  SubClase Productos Congelados de la SuperClase Productos
 * @author (Pablo Ramón Pérez Blasco "paramonso")
 * @version (1.0 - 11/11/2018)
 */
public class ProductoCongelado extends TemperatManteni
{
    public int temperaturaCongelacion ;
    /**
     * Constructor para los objetos de la clase ProductosCongelados
     */
    public ProductoCongelado(String nombre,String fechaCaducidad,String numeroLote,int tempMant,int  temperaturaCongelacion)
    { super(nombre,fechaCaducidad ,numeroLote,tempMant);
        this. temperaturaCongelacion =  temperaturaCongelacion;

    }

   

    public int getTemperaturaCongelacion(){ return temperaturaCongelacion;}

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


SubClase CongeladoPorAire extends SubClase ProductoCongelado de la SuperClase Productos
Código: [Seleccionar]
/**
 * SubClase CongeladoPorAire extends SubClase ProductoCongelado de la SuperClase Productos
 * @author (Pablo Ramón Pérez Blasco "paramonso")
 * @version (1.0 - 11/11/2018)
 *
 *
 */
public class CongeladoPorAire extends ProductoCongelado
{
    int porcentNitrogeno;
    int porcentOxigeno;
    int porcentDioxidoCarbono;
    int porcentVaporAgua;

    /**
     * Constructor for objects of class CongeladosPorAire
     */
    public CongeladoPorAire(String nombreProducto,String fechaCaducidad,
    String numeroLote,int tempMant,int temperaturaCongelacion,
    int porcentNitrogeno,int porcentOxigeno,int porcentDioxidoCarbono,int porcentVaporAgua)
    {
        super(nombreProducto,fechaCaducidad ,numeroLote,tempMant,temperaturaCongelacion);
        this.porcentNitrogeno=porcentNitrogeno;
        this.porcentOxigeno=porcentOxigeno;
        this.porcentDioxidoCarbono=porcentDioxidoCarbono;
        this.porcentVaporAgua=porcentVaporAgua;
    }

    public int getporcentNitrogeno(){ return porcentNitrogeno;}

    public int getPorcentOxigeno(){ return porcentOxigeno;}

    public int getPorcentDioxidoCarbono(){ return porcentDioxidoCarbono;}

    public int getPorcentVaporAgua(){ return porcentVaporAgua;}

    public void setporcentNitrogeno(){this. porcentNitrogeno= porcentNitrogeno;}

    public void setPorcentOxigeno(){this. porcentNitrogeno= porcentOxigeno;}

    public void setPorcentDioxidoCarbono(){this. porcentDioxidoCarbono= porcentDioxidoCarbono;}

    public void setPorcentVaporAgua(){this. porcentNitrogeno= porcentVaporAgua;}
//POLIMORFISMO presentarDatos()
   public void presentarDatos() {
        // La variable datos se inicializa vacia en el metodo para que no se cargen las entradas anteriores en la variable
        String datos="CONGELADOS POR AIRE\n";
        datos=datos+"Nombre: "+this.nombre +" | "+
        "Fecha Cadu.: "+this.getFechaCaducidad()+" | "+
        "Nº Lote: "+this.getNumeroLote()+" | "+
        "Temp.Mant.: "+this.getTempMant ()+"ºC | "+
        "Temp. Conge.:"+ this.getTemperaturaCongelacion()+"ºC | "+
        "\n% de Nitrogeno: "+ this.getporcentNitrogeno()+"% | "+
        "% de Oxigeno: "+ this.getPorcentOxigeno()+"% | "+
        "% de Dioxido Carbono:"+ this.getPorcentDioxidoCarbono()+"% | "+
        "% de Vapor Agua: "+ this.getPorcentVaporAgua()+"%";   
        System.out.println(datos); 
    }

}


SubClase CongeladoPorAgua extends SubClase ProductoCongelado de la SuperClase Productos
Código: [Seleccionar]
/**
 * SubClase CongeladoPorAgua extends SubClase ProductoCongelado de la SuperClase Productos
 * @author (Pablo Ramón Pérez Blasco "paramonso")
 * @version (1.0 - 11/11/2018)
 *
 *
 */

public class CongeladoPorAgua  extends ProductoCongelado
{

    // instance variables - replace the example below with your own
    public int salinidadDelAgua;

    /**
     * Constructor for objects of class CongeladosPorAgua
     */
    public CongeladoPorAgua(String nombreProducto,String fechaCaducidad,
    String numeroLote,int tempMant,
    int temperaturaCongelacion,int salinidadDelAgua)

    {super(nombreProducto,fechaCaducidad ,numeroLote,tempMant,temperaturaCongelacion);
        this.salinidadDelAgua=salinidadDelAgua;
    }

    public int getSalinidadDelAgua(){ return salinidadDelAgua;}

    public void setSalinidadDelAgua(){
        this.salinidadDelAgua=salinidadDelAgua;
    }
//POLIMORFISMO presentarDatos()
    public void presentarDatos() {
        // La variable datos se inicializa vacia en el metodo para que no se cargen las entradas anteriores en la variable
       
        String datos="CONGELADOS POR AGUA\n"+
        "Nombre: "+this.getNombre()+" | "+
        "Fecha Caducidad: "+this.getFechaCaducidad()+" | "+
        "Nº Lote : "+this.getNumeroLote()+" | "+
        "Tem.Mant.: "+this.getTempMant()+"ºC | "+
        "Temperatura Conge. :"+ this.getTemperaturaCongelacion()+"ºC | "+
        "\nSalinidad gr. x l. :"+ this.getSalinidadDelAgua()+"gr.l\n";   
        System.out.print(datos);
    }

}


SubClase CongeladoPorNitrogeno extends SubClase ProductoCongelado de la SuperClase Productos
Código: [Seleccionar]
/**
 * SubClase CongeladoPorNitrogeno extends SubClase ProductoCongelado de la SuperClase Productos
 * @author (Pablo Ramón Pérez Blasco "paramonso")
 * @version (1.0 - 11/11/2018)
 *
 *
 */



public class CongeladoPorNitrogeno extends ProductoCongelado
{
    String metodoCongelacion;
    int tiempoExpoAlNitrogeno;
     
    /*
     * Constructor for objects of class CongeladosPorNitrogeno
     */
    public CongeladoPorNitrogeno(String nombreProducto,String fechaCaducidad,
    String numeroLote,int tempMant,int temperaturaCongelacion,
    String metodoCongelacion,int tiempoExpoAlNitrogeno)
    {
        super(nombreProducto,fechaCaducidad ,numeroLote,tempMant,temperaturaCongelacion);
        this.metodoCongelacion=metodoCongelacion;
        this.tiempoExpoAlNitrogeno=tiempoExpoAlNitrogeno;
    }

    public String getMetodoCongelacion(){ return metodoCongelacion;}

    public int getTiempoExpoAlNitrogeno(){ return tiempoExpoAlNitrogeno;}

    public void setMetodoCongelacion(){ this.metodoCongelacion=metodoCongelacion;}

    public void setTiempoExpoAlNitrogeno(){this.tiempoExpoAlNitrogeno= tiempoExpoAlNitrogeno;}
   
    //POLIMORFISMO presentarDatos()
    public void presentarDatos(){
        // La variable datos se inicializa vacia en el metodo para que no se cargen las entradas anteriores en la variable
        String datos="CONGELADOS POR NITROGENO\n";
        datos=datos+"Nombre: "+this.nombre+" | "+
        "Fecha Cadu.: "+this.getFechaCaducidad()+" | "+
        "Nº Lote: "+this.getNumeroLote()+" | "+
        "Temp.Mant.: "+this.getTempMant()+"ºC| "+
        "Temp. Conge.:"+ this.getTemperaturaCongelacion()+"ºC | "+
        "\nMetodo Conge: "+ this.getMetodoCongelacion()+" | "+
        "Segun. Exp.al Nitro: "+ this.getTiempoExpoAlNitrogeno()+"seg.\n";   
         System.out.print(datos);
    }

}

Gracias.
Un saludo ;)
« Última modificación: 13 de Agosto 2019, 19:39 por Ogramar »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Buenas, para quien revise este ejercicio, comentar que en el código propuesto hay algunos elementos con los que no se ha trabajado en el curso y distintas cosas que habría que mejorar, por lo que no es recomendable usarlo como guía de solución.

Para implementar el polimorfismo explícitamente, todos los elementos deberíamos declararlos con el tipo estático común Producto, e instanciarlos con la clase concreta subclase de Producto. Por ejemplo no usaríamos:

Código: [Seleccionar]
        ProductoFresco productoFrescoA = new ProductoFresco("Patatas","15-1-2019","PA25421",5,"12-4-2018","España");
        ProductoRefrigerado productoRefrigradoA = new ProductoRefrigerado ("Merluza","15-10-2019","AS26453",1,"OSA2020" );
        CongeladoPorAgua productoPorAguaA = new CongeladoPorAgua ("Patata Prefrita","15-02-2021","AS25953",5,-25,5);
        CongeladoPorAire productoPorAireA = new CongeladoPorAire ("Sepia Extra","15-11-2025","AS25853",-15,-25,5,8,12,25);

etc.

Sino:

Código: [Seleccionar]
        Producto productoFrescoA = new ProductoFresco("Patatas","15-1-2019","PA25421",5,"12-4-2018","España");
        Producto productoRefrigradoA = new ProductoRefrigerado ("Merluza","15-10-2019","AS26453",1,"OSA2020" );
        Producto productoPorAguaA = new CongeladoPorAgua ("Patata Prefrita","15-02-2021","AS25953",5,-25,5);
        Producto productoPorAireA = new CongeladoPorAire ("Sepia Extra","15-11-2025","AS25853",-15,-25,5,8,12,25);

De esta forma implementamos el polimorfismo: todos los elementos son del supertipo y al mismo tiempo del subtipo concreto.

Otro aspecto a mejorar sería la herencia: el método presentarDatos() no está haciendo uso de la herencia, ya que no se invoca a super. De este modo, no está evitando la duplicidad de código entre las superclases y subclases. Este método no es un ejemplo de polimorfismo (está comentado así en el código, pero esto es erróneo).

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

Si se quiere ver una solución correcta y que se ciñe a los contenidos del curso puede consultarse https://aprenderaprogramar.com/foros/index.php?topic=2959.0

Aún con todo lo dicho, felicitar al autor del código por el esfuerzo y porque "haciendo" es como se aprende.

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