Foros aprenderaprogramar.com

Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: barriway en 16 de Julio 2015, 13:38

Título: Curso JAVA ejercicio CU00686B . Uso de palabras clave extends y super.
Publicado por: barriway en 16 de Julio 2015, 13:38
Esta podría ser una solución al ejercicio propuesto CU00686B.


Código: [Seleccionar]
public class Producto
{
    private String lote;
    private String fechaCaducidad;

    public Producto(){
        lote="";
        fechaCaducidad="";
    }

    public Producto(String lote,String fechaCaducidad){
        this.lote=lote;
        this.fechaCaducidad=fechaCaducidad;
    }

    public void setLote(String lote){
        this.lote=lote;
    }

    public void setFechaCaducidad(String fechaCaducidad){
        this.fechaCaducidad=fechaCaducidad;
    }

    public String getLote(){
        return lote;
    }

    public String getFechaCaducidad(){
        return fechaCaducidad;
    }

    public void mostrarProducto(){
        System.out.println("Lote : "+lote);
        System.out.println("Fecha de caducidad : "+fechaCaducidad);
    }
   
    public void mostrarInformacion(){
        //Sobreescrito en cada una de las subclases
    }
   
}


Código: [Seleccionar]
public class ProductoFresco extends Producto
{
    private String fechaEnvasado;
    private String paisOrigen;

    public ProductoFresco(){
        super();
        fechaEnvasado="";
        paisOrigen="";
    }

    public ProductoFresco(String numeroLote, String fechaCaducidad, String fechaEnvasado, String paisOrigen){
        super(numeroLote,fechaCaducidad);
        this.fechaEnvasado=fechaEnvasado;
        this.paisOrigen=paisOrigen;
    }

    public void setFechaEnvasado(String fechaEnvasado){
        this.fechaEnvasado=fechaEnvasado;
    }

    public void setPaisOrigen(String paisOrigen){
        this.paisOrigen=paisOrigen;
    }

    public String getFechaEnvasdo(){
        return fechaEnvasado;
    }

    public String getPaisOrigen(){
        return paisOrigen;
    }

    public void mostrarInformacion(){
         System.out.println("--- Producto Fresco ---");
        mostrarProducto();
        System.out.println("Fecha de envasado : "+fechaEnvasado);
        System.out.println("Pais de origen :"+paisOrigen);
    }
}



Código: [Seleccionar]
public class ProductoRefrigerado extends Producto
{
    private String codigoOrgSupAlim;

    public ProductoRefrigerado(){
        super();
        codigoOrgSupAlim="";
    }

    public ProductoRefrigerado(String lote, String fechaCaducidad, String codigoOrgSupAlim){
        super(lote,fechaCaducidad);
        this.codigoOrgSupAlim=codigoOrgSupAlim;
    }

    public void setCodigoOrgSupAlim(String codigoOrgSupAlim){
        this.codigoOrgSupAlim=codigoOrgSupAlim;
    }

    public String getCodigoOrgSupAlim(){
        return codigoOrgSupAlim;
    }

    public void mostrarInformacion(){
        System.out.println("--- Producto Refrigerado ---");
        mostrarProducto();
        System.out.println("Codigo del Organismo de Supervisión Alimentaria : "+codigoOrgSupAlim);

    }
}


Código: [Seleccionar]
public class ProductoCongelado extends Producto
{
    private double temperaturaCongelacion;

    public ProductoCongelado()
    {
        super();
        temperaturaCongelacion=0;
    }

    public ProductoCongelado(String lote,String fechaCaducidad,double temperaturaCongelacion){
        super(lote,fechaCaducidad);
        this.temperaturaCongelacion=temperaturaCongelacion;
    }

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

    public double getTemperaturaCongelacion(){
        return temperaturaCongelacion;
    }

    public void mostrarInformacion(){
        System.out.println("--- Producto Congelado ---");
        mostrarProducto();
        System.out.println("Temperatura de congelación : "+temperaturaCongelacion+"ºC");
    }
}


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

public class TestHerencia2
{
    public static void main(String Arg[]){
        ArrayList<Producto> listaProductos= new ArrayList<Producto>();

        listaProductos.add(new ProductoFresco("01","01/01/2021","01/01/2001","Argentina"));
        listaProductos.add(new ProductoRefrigerado("02","02/02/2022","COD-002"));
        listaProductos.add(new ProductoCongelado("03","03/03/2023",-3.50));

        System.out.println("Lista de Productos\n");
        Iterator<Producto> otroProducto=listaProductos.iterator();
        while(otroProducto.hasNext()){
            otroProducto.next().mostrarInformacion();
        }
        System.out.println("\nFin lista");
    }
}

Un saludo
Título: Re:Curso JAVA ejercicio CU00686B . Uso de palabras clave extends y super.
Publicado por: Mario R. Rancel en 16 de Julio 2015, 14:48
Hola!

El ejercicio se ve bien trabajado, mi enhorabuena.

Quiero hacerte algunas puntualizaciones que espero te sirvan para siempre ir mejorando:

Aunque la idea de usar los métodos mostrarProducto() y mostrarInformacion() no es del todo mala, hay una forma mejor para resolver lo que has tratado de plantear (mostrar toda la información sin repetir código).

En la clase Producto aparece:

Código: [Seleccionar]
    public void mostrarProducto(){
        System.out.println("Lote : "+lote);
        System.out.println("Fecha de caducidad : "+fechaCaducidad);
    }
   
    public void mostrarInformacion(){
        //Sobreescrito en cada una de las subclases
    }

En la clase ProductoRefrigerado aparece:

Código: [Seleccionar]
    public void mostrarInformacion(){
        System.out.println("--- Producto Refrigerado ---");
        mostrarProducto();
        System.out.println("Codigo del Organismo de Supervisión Alimentaria : "+codigoOrgSupAlim);

    }

Estás llamando al método mostrarProducto() de la superclase para evitar repetir código (buena idea). Sin embargo, tienes dos métodos con distinto nombre que vienen haciendo lo mismo (mala idea, creas una duplicidad que no es buena desde el punto de vista del diseño del código).

Podríamos resolverlo como se hace aquí: https://www.aprenderaprogramar.com/foros/index.php?topic=2306

Otra solución (preferible) sería usar una invocación a super para recuperar el código del método de la superclase y añadirlo a la subclase. Esto se explica en https://www.aprenderaprogramar.com/foros/index.php?topic=2440 y sería bueno que intentaras resolver el ejercicio de esta manera, pues es un buen ejemplo para entender cómo trabaja la herencia y cómo permite la reutilización de código.

Finalmente tendríamos la solución de usar el método toString(), esto se explica más adelante en el curso, no te preocupes por ella de momento.

Saludos
Título: Re:Curso JAVA ejercicio CU00686B . Uso de palabras clave extends y super.
Publicado por: barriway en 16 de Julio 2015, 20:29
Muchas gracias Mario.
Tomo nota de tu consejo y lo pondré en practica en el siguiente ejercicio.
Un saludo.