
Implementa una jerarquía de clases para un sistema de gestión de restaurante que modele diferentes tipos de platos.
Clase abstracta base
Debes crear una clase abstracta llamada Plato con los siguientes atributos:
nombre (String)
tiempoPreparacion (int) en minutos
calorias (double)
precio (double)
La clase Plato debe tener:
Un constructor que inicialice todos los atributos
Un método concreto servir() que devuelva un String con el mensaje «Sirviendo [nombre del plato]»
Un método concreto calcularPrecio() que devuelva el precio base más un 10% adicional (es decir, precio * 1.10)
Un método abstracto preparar() que devolverá un String con las instrucciones de preparación específicas para cada tipo de plato
Clases concretas derivadas
Luego, crea tres clases concretas que hereden de Plato:
Clase Pizza con atributos adicionales:
tipoDeMasa (String)
ingredientePrincipal (String)
tamanyo (int) en centímetros
Esta clase debe implementar el método preparar() que debe devolver: «Amasando la base de pizza de tipo [tipoDeMasa], añadiendo salsa de tomate, espolvoreando queso y añadiendo [ingredientePrincipal]. Horneando pizza de [tamanyo] cm durante [tiempoPreparacion] minutos.»
Clase Ensalada con atributos adicionales:
verduraPrincipal (String)
aderezo (String)
Esta clase debe implementar el método preparar() que debe devolver: «Lavando y cortando [verduraPrincipal] y el resto de vegetales frescos. Mezclando los ingredientes en un bol y añadiendo aderezo de [aderezo]. Tiempo de preparación: [tiempoPreparacion] minutos.»
Clase Sopa con atributos adicionales:
temperatura (int) en grados Celsius
baseDelCaldo (String)
Esta clase debe implementar el método preparar() que debe devolver: «Preparando caldo base de [baseDelCaldo]. Añadiendo verduras y especias. Cocinando a fuego lento durante [tiempoPreparacion] minutos. Servir a [temperatura] grados.»
Creación de objetos
Finalmente, crea un método main donde:
Crees una instancia de cada tipo de plato
Llames al método preparar() de cada plato y muestres el resultado por consola
Llames al método servir() de cada plato y muestres el resultado por consola
Muestres el precio calculado para cada plato usando el método calcularPrecio()
package oop.restaurante;
// codificado por Javier Cachón Garrido en MX-Linux con IntelliJ IDEA Community Edition.
// Método main
public class Restaurante {
public static void main(String[] args) {
Plato pizza = new Pizza("Pizza Margarita", 20, 600, 8.0, "fina", "jamón", 40);
Plato ensalada = new Ensalada("Ensalada", 10, 350, 4.5, "lechuga", "Javier");
Plato sopa = new Sopa("Sopa de pollo", 30, 100, 3.2, 70, "pollo");
System.out.println(pizza.preparar());
System.out.println(pizza.servir());
System.out.println("Precio final: " + pizza.calcularPrecio() + "€.");
System.out.println();
System.out.println(ensalada.preparar());
System.out.println(ensalada.servir());
System.out.println("Precio final: " + ensalada.calcularPrecio() + "€.");
System.out.println();
System.out.println(sopa.preparar());
System.out.println(sopa.servir());
System.out.println("Precio final: " + sopa.calcularPrecio() + "€.");
}
}
abstract class Plato {
protected String nombre;
protected int tiempoPreparacion;
protected double calorias;
protected double precio;
public Plato(String nombre, int tiempoPreparacion, double calorias, double precio) {
this.nombre = nombre;
this.tiempoPreparacion = tiempoPreparacion;
this.calorias = calorias;
this.precio = precio;
}
// Metodos Concretos
public String servir() {
return "Sirviendo " + nombre;
}
public double calcularPrecio() {
return precio * 1.10;
}
public abstract String preparar();
}
// Clase Pizza
class Pizza extends Plato {
private String tipoDeMasa;
private String ingredientePrincipal;
private int tamano;
public Pizza(String nombre, int tiempoPreparacion, double calorias, double precio,
String tipoDeMasa, String ingredientePrincipal, int tamano) {
super(nombre, tiempoPreparacion, calorias, precio);
this.tipoDeMasa = tipoDeMasa;
this.ingredientePrincipal = ingredientePrincipal;
this.tamano = tamano;
}
@Override
public String preparar() {
return "Amasando la base de pizza de tipo " + tipoDeMasa +
", añadiendo salsa de tomate, espolvoreando queso y añadiendo " + ingredientePrincipal +
". Horneando pizza de " + tamano + " cm durante " + tiempoPreparacion + " minutos.";
}
}
// Clase Ensalada
class Ensalada extends Plato {
private String verduraPrincipal;
private String aderezo;
public Ensalada(String nombre, int tiempoPreparacion, double calorias, double precio,
String verduraPrincipal, String aderezo) {
super(nombre, tiempoPreparacion, calorias, precio);
this.verduraPrincipal = verduraPrincipal;
this.aderezo = aderezo;
}
@Override
public String preparar() {
return "Lavando y cortando " + verduraPrincipal +
" y el resto de vegetales frescos. Mezclando los ingredientes en un bol y añadiendo aderezo de " +
aderezo + ". Tiempo de preparación: " + tiempoPreparacion + " minutos.";
}
}
// Clase Sopa
class Sopa extends Plato {
private int temperatura;
private String baseDelCaldo;
public Sopa(String nombre, int tiempoPreparacion, double calorias, double precio,
int temperatura, String baseDelCaldo) {
super(nombre, tiempoPreparacion, calorias, precio);
this.temperatura = temperatura;
this.baseDelCaldo = baseDelCaldo;
}
@Override
public String preparar() {
return "Preparando caldo base de " + baseDelCaldo +
". Añadiendo verduras y especias. Cocinando a fuego lento durante " + tiempoPreparacion +
" minutos. Servir a " + temperatura + " grados.";
}
}
Resultado de la ejecución y compilación:
Amasando la base de pizza de tipo fina, añadiendo salsa de tomate, espolvoreando queso y añadiendo jamón. Horneando pizza de 40 cm durante 20 minutos.
Sirviendo Pizza Margarita
Precio final: 8.8€.
Lavando y cortando lechuga y el resto de vegetales frescos. Mezclando los ingredientes en un bol y añadiendo aderezo de Javier. Tiempo de preparación: 10 minutos.
Sirviendo Ensalada
Precio final: 4.95€.
Preparando caldo base de pollo. Añadiendo verduras y especias. Cocinando a fuego lento durante 30 minutos. Servir a 70 grados.
Sirviendo Sopa de pollo
Precio final: 3.5200000000000005€.

Feedback y sugerencias
La solución presentada cumple con todos los requisitos del enunciado. Has implementado correctamente la jerarquía de clases con una clase abstracta Plato y las clases concretas Pizza, Ensalada y Sopa. Cada clase concreta implementa adecuadamente el método abstracto preparar() con las instrucciones específicas de preparación. Además, el método main crea instancias de cada tipo de plato, llama a los métodos preparar(), servir() y calcularPrecio(), y muestra los resultados por consola.
Puntos fuertes:
La estructura de la jerarquía de clases es clara y sigue las buenas prácticas de programación orientada a objetos.
Los métodos preparar(), servir() y calcularPrecio() están correctamente implementados y cumplen con el enunciado.
El código es legible y sigue las convenciones de nomenclatura de Java.
Áreas de mejora:
Podrías considerar añadir comentarios en el código para mejorar la comprensión, especialmente en métodos y constructores.
Aunque no es un requisito del enunciado, podrías implementar validaciones básicas en los constructores para asegurar que los valores de los atributos sean razonables (por ejemplo, que el tiempoPreparacion y el precio sean positivos).
En general, has hecho un excelente trabajo al implementar la solución. ¡Felicidades!
Licencia del Código Abierto: GPL: Pueden mejorarlo, pero no es para uso comercial, empresarial sino educacional.