Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Expand
titleDel 2 - Arv

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 ... {
 
    ...
}
Oppgave a) MenuItem-klassen

Course- og Meal-klassene har en del felles egenskaper, som kan samles i en felles superklasse kalt MenuItem. Skriv koden til MenuItem.

Expand
titleLF

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;
	}
}
Oppgave b) Bruk av MenuItem

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
titleLF

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

 

...