Foros aprenderaprogramar.com

Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: fedegaray en 24 de Abril 2015, 21:59

Título: call to super must be first statement in constructor Java herencia CU00686B
Publicado por: fedegaray en 24 de Abril 2015, 21:59
Hola comunidad. Aquí presento mi intento por resolver este ejercicio.

Citar
EJERCICIO

Se plantea desarrollar un programa Java que permita la gestión de una empresa agroalimentaria que trabaja con tres tipos de productos: productos frescos, productos refrigerados y productos congelados. Todos los productos llevan esta información común: fecha de caducidad y número de lote. A su vez, cada tipo de producto lleva alguna información específica. Los productos frescos deben llevar la fecha de envasado y el país de origen. Los productos refrigerados deben llevar el código del organismo de supervisión alimentaria. Los productos congelados deben llevar la temperatura de congelación recomendada. Crear el código de las clases Java implementando una relación de herencia desde la superclase Producto hasta las subclases ProductoFresco, ProductoRefrigerado y ProductoCongelado. Cada clase debe disponer de constructor y permitir establecer (set) y recuperar (get) el valor de sus atributos y tener un método que permita mostrar la información del objeto. Crear una clase testHerencia2 con el método main donde se cree un objeto de cada tipo y se muestren los datos de cada uno de los objetos creados.

Clase Producto
Código: [Seleccionar]
public class Producto {
    private String fechaCaducidad;
    private int numeroLote;
   
    public Producto () {
        fechaCaducidad = "";
        numeroLote = 0;
    }
   
    public Producto (String valorFechaCaducidad, int valorNumeroLote) {
        fechaCaducidad = valorFechaCaducidad;
        numeroLote = valorNumeroLote;
    }
   
    public void setFechaCaducidad (String valorFechaCaducidad){
        fechaCaducidad = valorFechaCaducidad;
    }
   
    public void setNumeroLote (int valorNumeroLote) {
        numeroLote = valorNumeroLote;
    }
   
    public String getFechaCaducidad () {
        return fechaCaducidad;
    }
   
    public int getNumeroLote () {
        return numeroLote;
    }
   
    public void dameDatosPro () {
        System.out.println ("Fecha de caducidad: " + getFechaCaducidad());
        System.out.println ("Número de lote: " + getNumeroLote());
    }
}


Clase ProductoFresco
Código: [Seleccionar]
public class ProductoFresco extends Producto  {
    private String fechaEnvasado;
    private String paisOrigen;
   
    public ProductoFresco () {
        super ();
        fechaEnvasado = "";
        paisOrigen = "";
    }
   
    public ProductoFresco (String valorFechaCaducidad, int valorNumeroLote, String valorFechaEnvasado, String valorPaisOrigen) {
        super (valorFechaCaducidad, valorNumeroLote);
        fechaEnvasado = valorFechaEnvasado;
        paisOrigen = valorPaisOrigen;
    }
       
    public void getFechaEnvasado (String valorFechaEnvasado) {
        fechaEnvasado = valorFechaEnvasado;
    }
   
    public void getPaisOrigen (String valorPaisOrigen) {
        paisOrigen = valorPaisOrigen;
    }
   
    public String getFechaEnvasado () {
        return fechaEnvasado;
    }
   
    public String getPaisOrigen () {
        return paisOrigen;
    }
   
    public void dameDatos() {
        dameDatosPro();
        System.out.println ("Fecha de envasado: " + getFechaEnvasado());
        System.out.println ("País de origen: " + getPaisOrigen());
    }
}


Clase ProductoRefrigerado
Código: [Seleccionar]
public class ProductoRefrigerado extends Producto  {
    private String codigoSupervAlim;
   
    public ProductoRefrigerado () {
        super ();
        codigoSupervAlim = "";
    }
   
    public ProductoRefrigerado (String valorFechaCaducidad, int valorNumeroLote, String valorCodigoSupervAlim) {
        super (valorFechaCaducidad, valorNumeroLote);
        codigoSupervAlim = valorCodigoSupervAlim;
    }
       
    public void getCodigoSupervAlim (String valorCodigoSupervAlim) {
        codigoSupervAlim = valorCodigoSupervAlim;
    }
   
    public String getCodigoSupervAlim () {
        return codigoSupervAlim;
    }
   
    public void dameDatos() {
        dameDatosPro();
        System.out.println ("Código del organismo de supervición alimentaria: " + getCodigoSupervAlim());
    }
}


Clase ProductoCongelado
Código: [Seleccionar]
public class ProductoCongelado extends Producto  {
    private double tempCongRecom;
   
    public ProductoCongelado () {
        super ();
        tempCongRecom = 0;
    }
   
    public ProductoCongelado (String valorFechaCaducidad, int valorNumeroLote, double valorTempCongRecom) {
        super (valorFechaCaducidad, valorNumeroLote);
        tempCongRecom = valorTempCongRecom;
    }
       
    public void getTempCongRecom (double valorTempCongRecom) {
        tempCongRecom = valorTempCongRecom;
    }
   
    public double getTempCongRecom () {
        return tempCongRecom;
    }
   
    public void dameDatos() {
        dameDatosPro();
        System.out.println ("Temperatura de congelación recomendada: " + getTempCongRecom());
    }
}


Clase TestProducto
Código: [Seleccionar]
import java.util.Scanner;

public class TestProducto {
    public static void main (String [] args) {
        System.out.println ("\f");
        ProductoFresco proFres = new ProductoFresco ();
        ProductoRefrigerado proRef = new ProductoRefrigerado ();
        ProductoCongelado proCon = new ProductoCongelado ();
        System.out.println ("Estos son los datos del producto fresco:");
        proFres.dameDatos();
        System.out.println ("");
        System.out.println ("Estos son los datos del producto refrigerado:");
        proRef.dameDatos();
        System.out.println ("");
        System.out.println ("Estos son los datos del producto congelado:");
        proCon.dameDatos();
    }
}
Título: Re:Ejemplo reutilización código Java herencia Ejercicio resuelto CU00686B
Publicado por: Alex Rodríguez en 25 de Abril 2015, 17:04
Hola fedegaray en líneas generales bien, con estas cosas mejorables:

En vez de un método dameDatos() en la subclase y otro dameDatosPro() en la superclase

Código: [Seleccionar]
   public void dameDatos() {
        dameDatosPro();
        System.out.println ("Fecha de envasado: " + getFechaEnvasado());
        System.out.println ("País de origen: " + getPaisOrigen());
    }


Sería preferible sobreescribir el método en la subclase y reutilizar el código de la superclase invocando a super() así:


Código: [Seleccionar]
   public void dameDatosPro() {
        super();
        System.out.println ("Fecha de envasado: " + getFechaEnvasado());
        System.out.println ("País de origen: " + getPaisOrigen());
    }

La idea es similar a lo que has hecho, pero esta forma se es más adecuada conforme a la programación orientada a objetos y a la reutilización de código. Esto aplica para todas las subclases.

En la clase con el main has creado productos vacíos, con lo cual no se pueden ver datos de los productos. Lo adecuado sería usar los constructores para crear productos con datos y poder ver esos datos, de esta forma podrías comprobar si el código funciona bien.

Saludos.
Título: Re:Ejemplo reutilización código Java herencia Ejercicio resuelto CU00686B
Publicado por: fedegaray en 26 de Abril 2015, 03:39
Me ha servido mucho tu aporte. No me había dado cuenta que la palabra clave super podía usarse en los métodos además de en el constructor. Estoy usando ese consejo para resolver el ejercicio de la siguiente lección.
En cuanto a haber creado productos vacíos, creí que así debía hacerlo para inicializar los campos según el protocolo. Yo había comprobado que los métodos funcionaban porque les cargaba los datos manualmente con los métodos get de cada producto. Pero tienes razón, a los fines de comprobar que las clases estén bien escritas conviene pasarle unos datos directamente en la clase de cada producto. Lo tendré en cuenta para la lección siguiente.
Muchas gracias por tu tiempo y conocimiento!!!
Título: Re:Ejemplo reutilización código Java herencia Ejercicio resuelto CU00686B
Publicado por: fedegaray en 26 de Abril 2015, 03:48
Auxilio! he intentado hacer lo que me propusiste (sobreescribir el método dameDatosPro()) invocando super() en la subclase, pero me tira el mensaje de error "call to super must be first statement in constructor".
No entiendo, si super () está bien colocado en el constructor, pero por alguna razón no me deja invocarlo en el método!!
Título: Re:Ejemplo reutilización código Java herencia Ejercicio resuelto CU00686B
Publicado por: fedegaray en 26 de Abril 2015, 03:51
Perdón por molestar, ya me he dado cuenta solito investigando un poco. Debía poner

Código: [Seleccionar]
super.dameDatosPro();
Igual gracias por brindar este espacio para pegar un grito al necesitar ayuda!
Título: Re:call to super must be first statement in constructor Java herencia CU00686B
Publicado por: Alex Rodríguez en 27 de Abril 2015, 10:20
Hola, realmente si sobreescribes el método, los dos métodos (en superclase y subclase) deben tener el mismo nombre, y si es así te basta con escribir super() y de ese modo Java ya entiende que estás llamando al método del mismo nombre en la superclase.

Nota: tener en cuenta que para que exista sobreescritura el método debe tener exactamente la misma signatura, si no es así sería un método distinto.

Si escribimos super.nombreMetodoSuperclase() estamos llamando a un método de la superclase, un método cualquiera. Si escribimos super() se entiende que llamamos al mismo método de la superclase, exactamente ese método.

Saludos
Título: Re:call to super must be first statement in constructor Java herencia CU00686B
Publicado por: fedegaray en 27 de Abril 2015, 14:53
Muchas gracias por la aclaración. Inestimable tu ayuda!
Título: Re:call to super must be first statement in constructor Java herencia CU00686B
Publicado por: edioswaldo en 29 de Septiembre 2015, 20:38
Hola estimado, fedegaray.
¿Pudiste emplear super(); en tu subclase?
Estoy con el mismo error "call to super must be first statement in constructor".
Sigo el consejo de Alex Rodríguez de poner la misma signatura.

Pero continua saliendo el mismo error, más bien cuando aplico tu solución "super.dameDatosPro();", compila bien.

Porfavor me puedes aclarar esto, o talves alguien del foro.

Saludos.
Título: Re:call to super must be first statement in constructor Java herencia CU00686B
Publicado por: Alex Rodríguez en 02 de Octubre 2015, 10:11
Hola edioswaldo, crea un nuevo hilo en el foro y pega el código de las clases con el que estás trabajando como se explica en https://www.aprenderaprogramar.com/foros/index.php?topic=1460.0

Una vez pegues el código, explica lo más detalladamente posible el problema o duda para poder ayudarte

Saludos