Dimostrare la conoscenza dei concetti di interfacce, ereditarietà, classi astratte e RTTI (Run Time Type Information: classe
Class, metodo
isInstance, ecc.) risolvendo il seguente esercizio.
Si vuole rappresentare il contenuto di una scatola che può contenere oggetti regalo e oggetti che possono essere mangiati. Tutti gli oggetti sono caratterizzati da una descrizione (
String) e un peso (
double), e gli oggetti che si possono mangiare hanno anche l'informazione delle calorie associate (
int).
Definire:
- una interfaccia Pesabile contenente la funzione double peso();
- una interfaccia Mangiabile contenente la funzione int calorie();
- una classe astratta OggettoScatola che rappresenta gli oggetti che possono essere contenuti nella scatola e che sono tutti pesabili;
- una classe Regalo che rappresenta oggetti non mangiabili che possono essere inseriti nella scatola;
- una classe Caramella che rappresenta oggetti mangiabili che possono essere inseriti nella scatola e per cui deve essere presente anche l'informazione sulle calorie;
- Una classe Scatola contenente i seguenti metodi:
- costruttore
- add(OggettoScatola x), che aggiunge l'elemento x nella scatola;
- double pesoTotale(), che calcola il peso totale degli oggetti nella scatola;
- int calorieTotali(), che calcola le calorie totali degli oggetti mangiabili nella scatola;
- String toString(), che restituisce una stringa con le informazioni degli oggetti contenuti nella scatola.
Si rispettino inoltre i seguenti vincoli:
- tutte le variabili di istanza nelle classi siano dichiarate private;
- evitare duplicazioni di dati e funzioni tra le classi Regalo e Caramella;
- il seguente programma di prova deve poter essere eseguito senza modifiche:
public class ProvaEserc2
{
public static void main
(String[] args
) {
Scatola s =
new Scatola
();
s.
add(new Caramella
("Liquirizia",
10.0,
100));
s.
add(new Regalo
("Adesivo",
5.0));
s.
add(new Caramella
("Miele",
10.0,
200));
s.
add(new Caramella
("Limone",
10.0,
50));
s.
add(new Regalo
("Pallina",
150.0));
System.
out.
println("Elementi nella scatola: "+s.
toString());
System.
out.
println("Peso totale della scatola: "+s.
pesoTotale());
System.
out.
println("Calorie totali della scatola: "+s.
calorieTotali());
}
}