Zum Inhalt springen

Aufgabe 09 - Mediathek

Zu Zen-Modus wechseln

Ihre erste eigene Klassenhierarchie: Eine Schul-Mediathek verwaltet Bücher, Filme und Hörbücher. Gemeinsames wandert in eine Basisklasse, Besonderes in Subklassen, und eine Verwaltungsklasse behandelt alle Medien einheitlich (siehe Kapitel Vererbung). Die Übung trainiert genau den Dreischritt, der in jedem objektorientierten Entwurf wiederkehrt: Gemeinsamkeiten erkennen, Hierarchie bauen, Wiederverwendung mit super() statt Kopieren.

  • Kapitel Vererbung (Basisklasse, super(), Überschreiben) und Kapitel Klassen in Python.
  • Aufgabe 08 abgeschlossen.
  • Sie entwerfen eine Basisklasse und leiten Subklassen mit eigenen Attributen ab.
  • Sie überschreiben Methoden und erweitern sie mit super() statt zu duplizieren.
  • Sie behandeln gemischte Objektsammlungen über die gemeinsame Basisklasse.
  • Reproduktion: die Vererbungssyntax wiedergeben und eine vorgegebene Basisklasse umsetzen (Teil A).
  • Reorganisation und Transfer: das Vererbungsmuster auf drei Subklassen übertragen und in einer Verwaltungsklasse anwenden (Teile B und C).
  • Reflexion, Problemlösung und Urteilsbildung: die Hierarchie um zeitabhängige Logik erweitern, den Entwurf grafisch darstellen und begründen (Teil D).

Die Übung ist auf etwa zwei Stunden ausgelegt. Teil D ist der Expertenteil.

  1. Implementieren Sie Medium mit title, year und is_borrowed (Startwert False).
  2. Ergänzen Sie describe(), das "Titel (Jahr)" liefert, und __str__, das describe() verwendet.
  3. Ergänzen Sie borrow() und give_back(): Doppeltes Ausleihen oder Zurückgeben eines nicht entlehnten Mediums führt zu einer verständlichen gedruckten Meldung (Exceptions folgen in einer späteren Übung).
  4. Testen Sie die Klasse mit einem Objekt, bevor Sie weitermachen.
  1. Book(Medium): zusätzlich author und pages; describe() wird überschrieben zu "Titel (Jahr), Buch von Autor, 320 Seiten". Pflicht: super().describe() als Baustein verwenden, nicht den Basistext nachbauen.
  2. Movie(Medium): zusätzlich director und minutes, eigene Beschreibung nach demselben Muster.
  3. Audiobook(Medium): zusätzlich narrator und minutes, eigene Beschreibung.
  4. Kontrolle: Kein Attribut und keine Logik existiert doppelt; alles Gemeinsame lebt in Medium. Prüfen Sie mit isinstance(book, Medium), dass die “ist-ein”-Beziehung greift.
  1. Implementieren Sie Library mit einer Medienliste, add(medium), search(text) (Suche im Titel, Groß-/Kleinschreibung egal) und print_inventory(): druckt alle Medien über deren describe(), ohne eine einzige Typabfrage. Markieren Sie mit einem Kommentar die Zeile, in der Polymorphismus wirkt.
  2. Befüllen Sie die Mediathek mit je zwei Exemplaren pro Typ und demonstrieren Sie: Inventar, Suche, Ausleihen, Doppel-Ausleihe (Meldung), Rückgabe.
  3. Ergänzen Sie available(): liefert eine Liste aller nicht entlehnten Medien. Auch hier: keine Typabfragen.
  1. Erweitern Sie borrow(due_date) um ein Fälligkeitsdatum (datetime.date). give_back() setzt es zurück.
  2. Implementieren Sie Library.overdue(today): liefert alle Medien, deren Frist am Stichtag überschritten ist. Überlegen Sie, wo diese Logik hingehört (in Medium als is_overdue(today) oder in Library?), entscheiden Sie sich und begründen Sie die Wahl in zwei Sätzen.
  3. Härtetest der Erweiterbarkeit: Ergänzen Sie eine vierte Medienart Magazine(Medium) (mit issue_number), ohne eine bestehende Zeile von Library zu ändern. Funktionieren Inventar, Suche und Fristen sofort? Dokumentieren Sie das Ergebnis.
  4. Zeichnen Sie das Klassendiagramm der fertigen Hierarchie (Vererbungspfeile, Assoziation zwischen Library und Medium mit Multiplizität), von Hand oder mit Mermaid.
  1. Woran erkennen Sie in einer Aufgabenstellung, dass sich eine Basisklasse lohnt?
  2. Was passiert ohne super().__init__(...) im Konstruktor einer Subklasse, und wie sieht die typische Fehlermeldung aus?
  3. Warum ist super().describe() dem Kopieren des Basistexts vorzuziehen? Nennen Sie das konkrete Wartungsszenario.
  4. print_inventory() enthält keine Typabfragen und funktioniert trotzdem für vier Medienarten. Welcher Mechanismus steckt dahinter?
  5. In welche Richtung zeigt der Vererbungspfeil im Klassendiagramm, und wie lautet die zugehörige Sprechweise?

media.py (Hierarchie), library.py (Verwaltung und Demo) und das Klassendiagramm. Die Begründungen aus Teil D als Kommentare im Code.