Sitzung: Jeden Freitag in der Vorlesungszeit ab 16 Uhr c. t. im MAR 0.005. In der vorlesungsfreien Zeit unregelmäßig (Jemensch da?). Macht mit!

Javakurs/Übungsaufgaben/Kassenbon++

Diese Aufgabe wird dir zeigen, wie man die Aufgabe Javakurs/Übungsaufgaben/Kassenbon via Kapselung löst.

Vorgabe

Folgender Code könnte als Einstiegspunkt für einen Objektorientierten Kassebon dienen. Dabei sollen mehrere Klassen miteinander interagieren: Receipt (der eigentliche Kassenbon) und ReceiptItem(ein Eintrag in dem Kassenbon). Am Anfang der main-Methode wird der Kassebon erstellt. Dannach werden vier Einträge an den Bon angefügt und letzlich der Bon ausgegeben.

/**
 * Main class for Receipt++
 *
 * @author Mario
 */
public class Main {

	/**
	 * This method will start all sub tests defined.
	 */
	public static void main(String[] args) {
		// buy some items and create a receipt for it
		Receipt r = new Receipt();		
		r.add( new ReceiptItem("15 Fischstäbchen", 3, 1.79) );
		r.add( new ReceiptItem("Steaks", 5, 3.99) );
		r.add( new ReceiptItem("Naturelle (1l)", 6, 4.99) );
		r.add( new ReceiptItem("Magnum Eis Creme", 2, 2.99) );
		
		// output receipt in a linear fashion
		r.print();
	}
}


Folgendes könnte die Ausgabe sein:

╔════════════════════════╗
║ FreitagsrundenShop 042 ║
║        Marchstr. 23    ║
║       10587 Berlin     ║
║     ☏ 030 314 213 86   ║
╚════════════════════════╝

15 Fischstäbchen         
  3x                  1.79
Steaks                   
  5x                  3.99
Naturelle (1l)           
  6x                  4.99
Magnum Eis Creme         
  2x                  2.99

                     =====
Summe EUR            61.24
                     =====

Aufgabe

Sobald du die Idee der Vorgabe verstanden hast, solltest du dir folgende Aufgaben ansehen, damit du lauffähigen Code erzeugst:

Das heißt:

  • Schreibe eine Klasse Receipt, die alle gekauften Gegenstände aufnimmt.
    • Füge einen no-argument-Konstruktor hinzu
    • Als einzige Eigenschaft brauchst du hier einen dynamischen Speicher, der beliebig viele Objekte aufnehmen kann. Zum Beispiel die ArrayList-Klasse aus der Java Collections API.
      • Schau dir dazu die Dokumentation von ArrayList in der Java6 API an.
      • Als Typ brauchst du dann ArrayList<ReceiptItem> (Eine Liste, die nur Werte vom Typ ReceiptItem aufnehmen kann. Wenn du mehr über diese Art von Typen wissen möchtest, dann befrage eine Suchmaschine oder einen Tutor nach dem Stichwort Generics)
      • Wichtig ist die Methode List.add(), welche ein Objekt anfügt.
    • Schreibe dir auch noch eine Methode print, die alle Elemente des Vectors ausgibt.
      for( ReceiptItem item : aList ){ }
      ist eine spezielle Form der for-Schleife (foreach) und gibt dir innerhalb der Schleife in der Variable item alle Elemente zurück, wenn du für aList deine Variable vom Typ List von oben angibst.
  • Schreibe des Weiteren eine Klasse ReceiptItem.
    • Diese braucht alle Eigenschaften eines Rechnungsgegenstandes, also Name, Preis(pro Einheit) und Anzahl(der Einheiten)
    • Stelle sicher, dass die Eigenschaften nur innerhalb der Klasse verändert werden können (public vs. private vs. protected, welches ist hier richtig?, warum?)
    • Schreibe für jede Eigenschaft einen getter und einen setter
    • Denke dran, bei den setter-Methoden die Eingabewerte zu überprüfen, damit du bspw. keine negativen Anzahlen für Gegenstände angeben kannst.
    • Erstelle letzlich auch einen Konstruktor mit allen drei Eigenschaften

Abschluss

Teste nun, ob deine Implementierung den Vorgaben entspricht.

Auch ist zu empfehlen jetzt noch etwas mit dem Code zu spielen. Folgende Aufgaben sind nur als Anregung gedacht, und werden ohne Musterlösung gegeben:

  • füge weitere Objekte ein
  • versuche die Kapselung zu brechen (Negative Preise, Leere Namen, ...).
  • Brieftaschen Aufgabe lösen: Was müsstest du tun, um eine Rechnung zu erstellen, die möglichst genau einen gegebenen Betrag kostet.