Denne delen handler om hvordan arv kan utnytte at Course og Meal har en del felles. Code Block |
---|
... class MenuItem {
...
}
// inherits from MenuItem
... class Course ... {
...
}
// inherits from MenuItem
... class Meal ... {
...
}
// updated to use MenuItem
... class Menu ... {
...
}
// updated to use MenuItem
... class Bill ... {
...
} |
Course- og Meal-klassene har en del felles egenskaper, som kan samles i en felles superklasse kalt MenuItem. Skriv koden til MenuItem. Expand |
---|
| Her er poenget å samle det som er felles. Klassen bør være abstract, siden det ikke gir mening å instansere den. Code Block |
---|
public abstract class MenuItem {
private final String name, description;
protected MenuItem(String name, String description) {
this.name = name;
this.description = description;
}
public String getName() {
return name;
}
public String getDescription() {
return description;
}
} |
|
Introduksjonen av MenuItem-klassen gjør det nødvendig å endre de eksisterende klassene. Skriv ny kode for Course-, Meal-, Menu- og Table-klassene, slik at de virker med og utnytter mulighetene som MenuItem-superklassen gir. Vurder spesielt om felt og metoder kan forenkles/slås sammen. Flett gjerne inn kommentarer til endringene og valg du gjør i koden. Expand |
---|
| Poenget her at siden Course og Meal nå har en felles superklasse, så blir det enklere å ha datastrukturer med begge disse objekttypene i. Dette forenkler både Menu- og Table-klassene. En blir her bedt om å skrive mye kode på nytt, og siden eksamen var digital, så bør det være greit i praksis. Det er greit å bare skrive de delene som blir endret, til nød forklare endringene med tekst. Code Block |
---|
public class Course extends MenuItem {
public Course(String name, String description) {
super(name, description);
}
...
}
public class Meal extends MenuItem {
public Meal(String name, String description) {
super(name, description);
}
...
}
public class Menu {
private Map<MenuItem, Double> items;
public double getPrice(Course course) throws IllegalArgumentException {
if (! items.containsKey(course)) {
throw new IllegalArgumentException("This menu does not include the course " + course.getName());
}
return items.get(course);
}
public void updatePrice(MenuItem item, double price) {
items.put(item, price);
}
public double getPrice(Meal meal) throws IllegalArgumentException {
if (! items.containsKey(meal)) {
throw new IllegalArgumentException("This menu does not include the meal " + meal.getName());
}
double total = items.get(meal);
if (total == 0.0) {
for (Course course : meal) {
total += getPrice(course);
}
}
return total;
}
}
public class Table {
private Collection<MenuItem> items = new ArrayList<>();
// har endret fra to add-metoder til én
public void addItem(MenuItem item) {
this.items.add(item);
}
//
private final Menu menu;
public Table(Menu menu) {
this.menu = menu;
}
public double getPrice() throws IllegalStateException {
double total = 0.0;
for (MenuItem item : items) {
try {
// note: cannot use menu.getPrice(item), since there is no menu.getPrice(MenuItem) method
if (item instanceof Course) {
total += menu.getPrice((Course) item);
} else if (item instanceof Meal) {
total += menu.getPrice((Meal) item);
}
} catch (IllegalArgumentException e) {
throw new IllegalStateException(e);
}
}
return total;
}
} |
|
Koden finnes på github, se del 2 av konten 2017 |