Klassendiagramm und OOP
Klassendiagramm
Was bedeutet überladen?
Beim überladen einer Methode werden mehrere Methoden gleichen Namens innerhalb einer Klasse definiert, die sich durch ihre Parameterlisten unterscheiden.
-> Methode hat den selben Namen, aber verschiedene Parameter!
Was bedeutet überschreiben?
Beim überschreiben einer Methode wird eine Methode der Basisklasse in der abgeleiteten Klasse neu definiert. Die Parameterliste ändert sich dabei nicht. Hier wird die Methode "toString" überschrieben, indem in jeder abgeleiteten Klasse der jeweilige Typ mit angegeben wird.
-> Methode wird in Unterklasse überschrieben!
Was bedeuten die Zugriffsparameter
- - : private -> Also nur innerhalb der eigenen Klasse verfügbar
- # : protected -> Sind ausschließlich innerhalb ihrer Klasse und der von ihnen abgeleiteten Klassen verwendbar
- + : public -> Unterliegen keinen Zugriffsbeschränkungen
Was bedeutet {abstract} im Klassendiagramm
- Abstrakte Klassen sind nicht vollständig - man kann davon keine Objekte direkt erzeugen
- Sie dienen als Grundlage für andere Klassen (Basisklassen)
- Können abstrakte Methoden enthalten, nur deklariert aber nicht implementiert
Was bedeutet {static} im Klassendiagramm
- Statische Mitglieder (Attribute oder Methoden) gehören zur Klasse, nicht zu einzelnen Objekten
- Man kann sie verwenden um ein Objekt zu erzeugen.
Aufgaben
Die Methode "getAusverkauft" ist folgendermaßen implementiert:
public static Ausverkauft getAusverkauft()
{
falls ausverkauft = null
ausverkauft = new Ausverkauft()
rueckgabe ausverkauft
}
public static Ausverkauft getAusverkauft()
{
falls ausverkauft = null
ausverkauft = new Ausverkauft()
rueckgabe ausverkauft
}
Erläutern Sie hieran die Besonderheiten der Singleton-Klasse "Ausverkauft"
- Die Methode sorgt dafür das nur ein einziges Objekt der Klasse Ausverkauft existiert.
- Wenn noch keins da ist, wird es erstellt.
- Danach wird immer dieses eine Objekt zurückgegeben
- -> Das nennt man Singleton-Pattern
Warum ist diese Methode "static"?
- Die Methode kann man ohne Objekt aufrufen, also es muss kein Objekt instanziiert werden
- Sie gehört zur Klasse selbst, nicht zu einem Objekt
Ausverkauft a = Ausverkauft.getAusverkauft();
- Das ist wichtig, weil man ja noch gar kein Objekt hat, bevor man diese Methode aufruft.
Implementieren Sie einen Konstruktor der Klasse "Konzert", der u.a. die Zahl der verkauften Karten auf 0 und den Zustand auf "nichtAusverkauft" setzt.
public Konzert(datum Date, küenstler String)
{
this.datum = datum,
this.kuenstler = kuenstler,
this.verkaufteKarten = 0,
this.Zustand = NichtAusverkauft.getNichtAusverkauft()
}
Implementieren Sie die Methode "auswertung" der Klasse "nichtAusverkauft". Diese prüft, ob für das betreffende Konzert mehr als 1000 Karten verkauft werden wurden. In diesem Fall setzt sie den Zustand des Konzerts auf "Ausverkauft".
Public void auswertung(Konzert konzert)
{
wenn konzert.verkaufteKarten > 1000
konzert.Zustand = Ausverkauft.GetAusverkauft()
}
Implementieren Sie die Methode "kartenverkauf", der die Zahl der verkauften Karten erhöht und anschließend eine Auswertung des Zustands auslöst.
public void kartenverkauf(int anzahl)
{
verkaufteKarten = verkaufteKarten + anzahl
zustand.auswertung(this) // this, weil wir uns in der Klasse "Konzert" befinden.
}
Implementieren Sie die folgende Funktion, die die Anzahl ausverkaufter Konzerte bestimmt.
public int anzahlAsuverkaufterKonzerte (Konzert[] liste)
{
zaehler = 0
fuer alle Konzert in liste
falls konzert.zustand hatTyp Ausverkauft
zaehler = zaehler + 1
}
__________________
Ergänzen Sie das folgende unvollständige UML-Klassendiagramm nach den folgenden Vorgaben.
- Die Klasse "RealMitglied" soll die nur klasseninternen sichtbaren Instanzvariablen "name", "service", "rating", und "countRatings" beinhalten.
- Der öffentliche Konstruktor der Klasse "RealMitglied" soll zwei Übergabeparameter haben, mit denen "name" und "service" initialisiert werden.
- Der öffentliche Konstruktor der klasse "Proxy" soll zwei "RealMitglied"-Objekte übergeben bekommen und diese mit diese mit den Referenzen "mitglied" und "user" verknüpfen.
- Die Klassen "Proxy" und "RealMitglied" sollen beide das Interface Mitglied implementieren.
- Zeichen Sie alle Klassenbeziehungen ein:
----------------------------
Es ist folgendes Pflichtenheft gegeben:
- ein Artikel hat einen Namen und einen Preis
- Beim Anlegen eines neuen Artikels werden Name und Preis festgelegt
- Der Name eines Artikels kann abgefragt, aber nicht verändert werden.
- Der Preis eines Artikels kann abgefragt und verändert werden.
- Einem "Warenkorb" können verschiedene Artikel in beliebigen Stückzahlen hinzugefügt werden.
- Für den Inhalt des Warenkorbs kann der Gesamtwert berechnet werden.
- Instanzvariablen sind nach außen nicht sichtbar (information hiding/geheimnisprinzip)
- Methoden sollen von überall her aufrufbar sein.
Das Pflichtenheft wird um folgende Punkte erweitert:
- Die Versankosten sollen ebenfalls ermittelt werden.
- Bei Standard-Lieferungen und Express-Lieferungen werden unterschiedliche Berechnungsalgorytmen verwendet.
- Die Berechnungsalgorythmen der Versankosten wechseln häufig, deshalb sollen sie vom Warenkorb entkoppelt sein
- Dazu soll die Klasse "Warenkorb" um eine Referenz "versand" vom Typ des Interdace "Versand", eine Methode "setVersand" und Setzen der Versandart und eine Methode "getVersandkosten" zur Abfrage der Versandkosten erweitert werden.
- -> Ergänzen Sie das Klassendiagramm!
Implementieren Sie in Pseudocode die Methode "getVersandkosten" der Klasse Warenkorb
public double getVersandkosten()
{
double versankosten = versand.berechnen(this)
rueckgabe versandkosten
}
Weitere OOP Begrifflichkeiten
- Garbage Collector -> Räumt nicht mehr verwendete Objekte aus dem Speicher.
- Getter und Setter -> Dienen zum Zugriff auf private Attribute einer Klasse und ermöglichen Kontrolle beim Lesen und Ändern der Daten
- Konstruktor -> Wird aufgerufen wenn ein Objekt neu erzeugt wird. Kann Parameter annehmen, um das Objekt gleich richtig zu initialisieren
- this -> Verweist auf das aktuelle Objekt, innerhalb der Klasse
- Polymorphie -> Objekte können unterschiedliches Verhakten Zeigen, obwohl sie denselben Typ haben.
- interface -> Eine Schnittstelle, die vorgibt was eine Klasse tun soll, Implementierung erfolgt in Klassen
- Abstrakte Klasse -> Kann nicht dierekt instanziert werdne und dient als gemeinsame Oberklasse mit fertiger funktionalität
- Kapselung -> Daten werden versteckt (private) und nur über Getter/Setter zugänglich gemacht.