Foros aprenderaprogramar.com
Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: fedegaray en 24 de Abril 2015, 21:59
-
Hola comunidad. Aquí presento mi intento por resolver este ejercicio.
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
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
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
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
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
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();
}
}
-
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
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í:
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.
-
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!!!
-
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!!
-
Perdón por molestar, ya me he dado cuenta solito investigando un poco. Debía poner
super.dameDatosPro();
Igual gracias por brindar este espacio para pegar un grito al necesitar ayuda!
-
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
-
Muchas gracias por la aclaración. Inestimable tu ayuda!
-
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.
-
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