Javakurs/Übungsaufgaben/Kassenbon++: Unterschied zwischen den Versionen
K (default-Konstruktoren kann man nicht hinzufügen ...) |
(→Vorgabe) |
||
(Eine dazwischenliegende Version von einem anderen Benutzer wird nicht angezeigt) | |||
Zeile 34: | Zeile 34: | ||
╔════════════════════════╗ | ╔════════════════════════╗ | ||
║ FreitagsrundenShop 042 ║ | ║ FreitagsrundenShop 042 ║ | ||
− | ║ | + | ║ Marchstr. 23 ║ |
║ 10587 Berlin ║ | ║ 10587 Berlin ║ | ||
║ ☏ 030 314 213 86 ║ | ║ ☏ 030 314 213 86 ║ | ||
Zeile 53: | Zeile 53: | ||
</pre> | </pre> | ||
− | |||
= Aufgabe = | = Aufgabe = | ||
Zeile 62: | Zeile 61: | ||
* Schreibe eine Klasse '''Receipt''', die alle gekauften Gegenstände aufnimmt. | * Schreibe eine Klasse '''Receipt''', die alle gekauften Gegenstände aufnimmt. | ||
** Füge einen '''''no-argument-''Konstruktor''' hinzu | ** Füge einen '''''no-argument-''Konstruktor''' hinzu | ||
− | ** Als einzige Eigenschaft brauchst du hier einen dynamischen Speicher, der beliebig viele Objekte aufnehmen kann. | + | ** 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 [http://download.oracle.com/javase/6/docs/api/java/util/ | + | *** Schau dir dazu die [http://download.oracle.com/javase/6/docs/api/java/util/ArrayList.html Dokumentation von ArrayList in der Java6 API] an. |
− | *** Als Typ brauchst du dann ''' | + | *** 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. | |
− | *** Wichtig ist die Methode ''' | ||
** Schreibe dir auch noch eine Methode '''print''', die alle Elemente des Vectors ausgibt. | ** Schreibe dir auch noch eine Methode '''print''', die alle Elemente des Vectors ausgibt. | ||
− | **: <pre>for( ReceiptItem item : | + | **: <pre>for( ReceiptItem item : aList ){ }</pre> 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''' | + | * Schreibe des Weiteren eine Klasse '''ReceiptItem'''. |
** Diese braucht alle '''Eigenschaften''' eines Rechnungsgegenstandes, also ''Name'', ''Preis''(pro Einheit) und ''Anzahl''(der Einheiten) | ** 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?) | + | ** 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''' | ** 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 | + | ** 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''' | ** Erstelle letzlich auch einen '''Konstruktor''' mit allen drei '''Eigenschaften''' | ||
Aktuelle Version vom 7. März 2013, 09:46 Uhr
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.