Übungsaufgaben
Nachfolgend finden Sie verschiedene Übungsaufgaben, die sich auf die Themen Assoziation, Aggregation,
Komposition und Vererbung (inklusive der Verwendung von super()) beziehen.
1. Assoziation
Aufgabe:
Erstellen Sie zwei Klassen, die über eine Assoziation miteinander verknüpft sind. Achten Sie darauf, dass die eine Klasse
keinen Besitzanspruch an die andere Klasse hat, sondern lediglich eine (optionale) Referenz darauf hält.
- Definieren Sie beispielsweise die Klassen
OrderundCustomer. - Sorgen Sie dafür, dass
Orderoptional auf einenCustomerverweisen kann (z. B.set_customer/get_customer). - Implementieren Sie eine Methode, die prüft, ob ein
Order-Objekt einen gültigenCustomerhat, und geben Sie das Ergebnis als Text (z. B."Hat Kunden"/"Hat keinen Kunden") aus. - Testen Sie Ihr Programm, indem Sie sowohl einen
Orderohne Kunden als auch einenOrdermit Kunde erstellen.
Erweiterung:
- Fügen Sie eine zweite Klasse hinzu, zum Beispiel ShippingAddress, die von Order referenziert wird, und verdeutlichen
Sie damit, dass mehrere Assoziationen gleichzeitig existieren können.
2. Aggregation
Aufgabe:
Erstellen Sie eine Aggregation, bei der eine Klasse eine Liste von Objekten einer anderen Klasse verwaltet. Ein
mögliches Szenario wäre zum Beispiel eine Garage, in der sich mehrere Car-Objekte befinden.
- Legen Sie die Klassen
GarageundCaran. - Implementieren Sie in der Klasse
GarageMethoden, umCar-Objekte zur Liste hinzuzufügen und zu entfernen. - Schreiben Sie eine Methode, die alle vorhandenen
Car-Objekte (z. B. über__str__in Python) ausgibt. - Testen Sie das Programm, indem Sie mehrere
Car-Objekte erstellen, sie in dieGaragelegen und die Ausgabe kontrollieren.
Erweiterung:
- Fügen Sie eine zusätzliche Klasse Bike hinzu, die ebenfalls in dieselbe Garage aufgenommen werden kann.
- Prüfen Sie, wie Sie die Verwaltung der Objekte am besten organisieren: z. B. eine Liste für alle Fahrzeuge, oder
getrennte Listen für verschiedene Typen von Fahrzeugen?
3. Komposition
Aufgabe:
Erstellen Sie eine Komposition, bei der das enthaltene Objekt nur in Zusammenhang mit dem übergeordneten Objekt
existieren kann. Ein mögliches Szenario könnte z. B. ein House sein, das immer genau ein Door-Objekt besitzt.
Sobald das House zerstört wird, existiert auch die Door nicht mehr.
- Definieren Sie die Klasse
House, die im Konstruktor einDoor-Objekt anlegt. - Definieren Sie die Klasse
Door, die über eine einfache Eigenschaft (z. B. Farbe oder Material) verfügt. - Implementieren Sie in der Klasse
HouseMethoden, um auf die Eigenschaften desDoor-Objekts zuzugreifen (z. B.open_door,close_dooroder einfachget_door_color). - Testen Sie das Programm, indem Sie ein
House-Objekt erstellen und die Eigenschaften oder Methoden desDoor-Objekts aufrufen.
Erweiterung:
- Fügen Sie weitere Kompositionen in der Klasse House hinzu, z. B. ein Roof, das ebenfalls nur in Verbindung mit
dem House existiert.
- Stellen Sie sich vor, das House kann optional mehr als eine Door haben (z. B. Haustür, Hintertür). Diskutieren Sie:
Handelt es sich dann noch um Komposition oder eher um Aggregation?
4. Vererbung
Aufgabe:
Demonstrieren Sie Vererbung, indem Sie eine Basisklasse und mindestens eine abgeleitete Klasse erstellen. Als Beispiel
kann eine Basisklasse Animal dienen, von der Klassen wie Dog und Cat erben.
- Erstellen Sie eine Basisklasse
Animalmit Methoden wiemake_sound()und einer Eigenschaftname. - Erstellen Sie eine abgeleitete Klasse
Dog, die die Methoden und Eigenschaften vonAnimalerbt. - Überschreiben Sie
make_sound()inDogmit einer spezifischen Ausgabe (z. B."Wuff"). - Instanziieren Sie Objekte von beiden Klassen und rufen Sie die jeweilige
make_sound()-Methode auf.
Erweiterung:
- Erstellen Sie eine weitere abgeleitete Klasse Cat und überschreiben Sie make_sound() ebenfalls.
- Experimentieren Sie mit Mehrfachvererbung (falls Ihre Programmiersprache dies erlaubt) und beobachten Sie, wie
die Method Resolution Order (MRO) in Python wirkt.
5. Verwendung von super()
Aufgabe:
Vertiefen Sie den Einsatz von super(), indem Sie den Konstruktor der Basisklasse explizit aus einer
abgeleiteten Klasse aufrufen und dort zusätzliche Initialisierungen vornehmen.
- Erstellen Sie eine Basisklasse
Bookmit Eigenschaften wietitleundauthor. - Definieren Sie eine abgeleitete Klasse
EBook, die zusätzlich eine Eigenschaft wiefile_sizebesitzt. - Rufen Sie im Konstruktor von
EBookden Basisklassen-Konstruktor mitsuper().__init__(title, author)auf, bevor Siefile_sizesetzen. - Legen Sie in einer Testmethode ein Objekt
EBookan, geben Sie alle Eigenschaften aus und überprüfen Sie, ob diese korrekt gesetzt wurden.
Erweiterung:
- Fügen Sie eine Methode in der Basisklasse hinzu (z. B. read()), die in der abgeleiteten Klasse EBook
überschrieben wird. Rufen Sie innerhalb der neuen Methode in EBook wieder die originale Methode mit
super().read() auf, um sicherzustellen, dass der Basisklassen-Code ebenfalls ausgeführt wird.
6. Zusammenführung aller Konzepte
Aufgabe (Projektaufgabe):
Entwerfen Sie ein kleines System, das Assoziation, Aggregation, Komposition und Vererbung miteinander vereint.
Ein mögliches Szenario:
- Erstellen Sie eine Basisklasse
Sensorund eine davon abgeleitete KlasseTemperatureSensor. - Eine Klasse
SensorManageraggregiert mehrereSensor-Objekte (Liste). - Eine Klasse
Devicebesitzt über Komposition genau einenSensorManager. - Eine Klasse
Userist lediglich assoziiert mit demDevice, da der Benutzer über ein Interface auf dasDevicezugreift (z. B.User.set_device(device)undUser.configure_device()).
Ziel ist es, anhand dieses Szenarios die verschiedenen Beziehungen und die Vererbung in einer Anwendung zu demonstrieren.
Hinweise für die Umsetzung:
- Skizzieren Sie zunächst ein Klassendiagramm, um die Beziehungen zu verdeutlichen.
- Implementieren Sie die Klassen Schritt für Schritt und testen Sie die Methoden.
- Diskutieren Sie in kleinen Kommentaren im Code, warum es sich bei den Beziehungen um Assoziation, Aggregation oder Komposition handelt und an welcher Stelle Vererbung zum Einsatz kommt.
Viel Erfolg bei der Bearbeitung der Übungsaufgaben!
Nutzen Sie die Beispiele aus dem Hauptdokument zur Orientierung und versuchen Sie, die Konzepte auf eigene
Anwendungsfälle zu übertragen. Dadurch gewinnen Sie praktische Erfahrung in der Anwendung von Assoziation, Aggregation,
Komposition und Vererbung, einschließlich der sicheren Verwendung von super().