Autor Tema: call to super must be first statement in constructor Java herencia CU00686B  (Leído 8828 veces)

fedegaray

  • Principiante
  • **
  • Mensajes: 81
    • Ver Perfil
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();
    }
}
« Última modificación: 27 de Abril 2015, 10:17 por Alex Rodríguez »

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
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.

fedegaray

  • Principiante
  • **
  • Mensajes: 81
    • Ver Perfil
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!!!

fedegaray

  • Principiante
  • **
  • Mensajes: 81
    • Ver Perfil
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!!

fedegaray

  • Principiante
  • **
  • Mensajes: 81
    • Ver Perfil
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!

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
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

fedegaray

  • Principiante
  • **
  • Mensajes: 81
    • Ver Perfil
Muchas gracias por la aclaración. Inestimable tu ayuda!

edioswaldo

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 10
    • Ver Perfil
Re:call to super must be first statement in constructor Java herencia CU00686B
« Respuesta #7 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.

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
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

 

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