Programmieren I Martin Schultheiß Hochschule Darmstadt Wintersemester 2010/2011 1 / 22 2 / 22 Strategie zum Entwurf von Klassen Objektorientierte Sichtweise: Mit welchen Objekten habe ich es in einem Programm zu tun? Suche nach gemeinsamen Eigenschaften und Methoden Davon ausgehend Entwurf der Klassen mit ihren Attributen und Methoden Empfehlenswert: Schematische Übersicht 3 / 22 Handout S. 1
Beispiele Kontenverwaltung Klasse: Konto Attribute: Attribut Inhaber Adresse Kontostand Kreditrahmen Typ 4 / 22 Lagerverwaltung Klasse: Artikel Attribute Attribut Beschreibung EAN (Barcode) Bestand Einkaufspreis Verkaufspreis Lagerort Typ int 5 / 22 Kundenverwaltung Klasse: Kunde Attribute: Attribut Name Adresse Zahlungsart Kredit Rabatt Kundenklasse Typ enum enum 6 / 22 Handout S. 2
Bibliothek Klasse: Buch Attribute: Attribut Autor Titel ISBN Verlag Erscheinungsjahr Auflage ausgeliehen Ausleiher Typ int int boolean 7 / 22 Grundgerüst der Klasse Deklaration der Klasse erfolgt in der Datei KlassenName.java. Grundgerüst: p u b l i c c l a s s Klassenname { Konvention: Namen von Klassen beginnen immer mit Großbuchstaben (wortweise, z. B. MeineKlasse). 8 / 22 Hinzufügen der Attribute Anschließend werden die Attribute deklariert. Faustregel: Attribute sind in der Regel privat: p u b l i c c l a s s Klassenname { p r i v a t e typ a t t r i b u t ; Konvention: Attribute und Methoden beginnen mit Kleinbuchstaben. Ausnahme: öffentliche konstante Attribute (public nal static ) komplett in Großbuchstaben. 9 / 22 Handout S. 3
Der Konstruktor Konstruktoren heißen genauso wie die Klasse und haben keinen Rückgabewert. Wird kein Konstruktor definiert, existiert implizit ein Standardkonstruktor: c l a s s Klassenname { p u b l i c Klassenname ( ) { In der Regel wird man eigene Konstruktoren definieren. Falls benötigt, muss dann auch der Standardkonstruktor (d. h. ohne Parameter) definiert werden. Konstruktoren sind in aller Regel public. 10 / 22 Zugriffsmethoden (getter/setter) Ein Teil der Methoden ist notwendig, um auf private Attribute lesend (getter) oder schreibend (setter) zuzugreifen. Getter und Setter tragen die Namen getattributname bzw. setattributname. Ausnahme für Attribute vom Typ boolean: Getter heißt isattributname. Grundüberlegung: Auf welche Attribute ist ein direkter Lese- oder Schreibzugriff nötig? Faustregel: Zugriffsmethoden werden in der Regel als public definiert. 11 / 22 Weitere Methoden Die problemspezifische Funktionaliät steckt in weiteren Methoden. Grundfrage: Welche Fähigkeiten haben alle Objekte des gleichen Typs? Die Methoden können sowohl private als auch public sein. Die öffentlichen Methoden repräsentieren nach außen die Schnittstellen für die Kommunikation mit den Objekten. Neben dem Grunddesign der Klasse liegt hier die eigentliche Kreativität beim Programmdesign. 12 / 22 Handout S. 4
Beispiel Klasse Konto Methoden Methode einzahlung auszahlung ueberweisung lastschrift 13 / 22 Klasse GeldAutomat Methoden Methode Art Geld ausgeben privat Kontostand ändern privat Auszahlung öffentlich benutzt intern die Methoden»Geld ausgeben«und»kontostand ändern«14 / 22 Klasse Buch Buch autor titel ausleiher + getautor() + gettitel() +boolean isausgeliehen() + getausleiher() +boolean ausleihe(string) +void rueckgabe() Aus Gründen der Übersichtlichkeit fehlen Attribute wie isbn, verlag, 15 / 22 Handout S. 5
Code der Klasse Buch p u b l i c c l a s s Buch { p r i v a t e S t r i n g a u t o r ; p r i v a t e S t r i n g t i t e l ; p r i v a t e S t r i n g a u s l e i h e r ; p u b l i c Buch ( S t r i n g autor, S t r i n g t i t e l ) { t h i s. a u t o r = a u t o r ; t h i s. t i t e l = t i t e l ; t h i s. a u s l e i h e r = n u l l ; p u b l i c S t r i n g g e t A u s l e i h e r ( ) { r e t u r n a u s l e i h e r ; p u b l i c S t r i n g getautor ( ) { r e t u r n a u t o r ; p u b l i c S t r i n g g e t T i t e l ( ) { r e t u r n t i t e l ; 16 / 22 Code der Klasse Buch (Forts.) p u b l i c b o o l e a n i s A u s g e l i e h e n ( ) { r e t u r n a u s l e i h e r!= n u l l ; p u b l i c v o i d a u s l e i h e ( S t r i n g a u s l e i h e r ) { t h i s. a u s l e i h e r = a u s l e i h e r ; p u b l i c v o i d rueckgabe ( ) { a u s l e i h e r = n u l l ; p u b l i c S t r i n g t o S t r i n g ( ) { S t r i n g r e s u l t = t h i s. a u t o r+" : "+ t i t e l ; i f ( i s A u s g e l i e h e n ( ) ) { r e s u l t+=" ( a u s g e l i e h e n an "+a u s l e i h e r+" ) " ; e l s e { r e s u l t+=" ( n i c h t a u s g e l i e h e n ) " ; r e t u r n r e s u l t ; 17 / 22 Erweiterung des Beispiels Für die Bibliothek soll eine gleichnamige Klasse Bibliothek geschaffen werden. Diese soll in einem Feld die in der Bibliothek vorhandenen Bücher speichern (also die Instanzen der Klasse Buch). Über den Index des Buches soll man auf die einzelnen Instanzen der Klasse Buch zugreifen können. Eine solche Klasse wird häufig als Containerklasse bezeichnet. 18 / 22 Handout S. 6
Klassendiagramm Bibliothek int anzahl int max Buch buecher[] +void neuesbuch(autor :, titel : ) +Buch getbuch(index : int) 1 0..* Buch autor titel ausleiher + getautor() + gettitel() +boolean isausgeliehen() + getausleiher() +void ausleihe(ausleiher : ) +void rueckgabe() 19 / 22 Code der Klasse Bibliothek p u b l i c c l a s s B i b l i o t h e k { p r i v a t e i n t a n z a h l ; p r i v a t e Buch [ ] buecher ; p r i v a t e s t a t i c f i n a l i n t max = 1 0 0 ; p u b l i c B i b l i o t h e k ( ) { a n z a h l = 0 ; buecher = new Buch [ max ] ; 20 / 22 Code der Klasse Bibliothek (Forts.) p u b l i c v o i d neuesbuch ( S t r i n g autor, S t r i n g t i t e l ) { i f ( anzahl<max) { Buch b = new Buch ( autor, t i t e l ) ; buecher [ anzahl++] = b ; p u b l i c Buch getbuch ( i n t i n d e x ) { i f ( index >=0 && index<a n z a h l ) { r e t u r n buecher [ i n d e x ] ; e l s e { r e t u r n n u l l ; 21 / 22 Handout S. 7
Code der Klasse Bibliothek (Forts.) In diesem Beispiel enthält die Klasse Bibliothek auch die main-methode, das demonstriert, wie ein Buch in die Bibliothek aufgenommen wird und ausgeliehen bzw. zurück gegeben werden kann. p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { B i b l i o t h e k bib = new B i b l i o t h e k ( ) ; bib. neuesbuch ( "Dan Brown", " S a k r i l e g " ) ; bib. getbuch ( 0 ). a u s l e i h e ( "Thomas Schmidt " ) ; System. out. p r i n t l n ( bib. getbuch ( 0 ) ) ; bib. getbuch ( 0 ). rueckgabe ( ) ; System. out. p r i n t l n ( bib. getbuch ( 0 ) ) ; 22 / 22 Handout S. 8