// Interface für Medien, die ausgeliehen werden können interface Ausleihbar { int getMaxVerlängerungen(); // Gibt die maximale Anzahl an Verlängerungen zurück boolean kannVerlängern(); // Prüft, ob das Medium verlängerbar ist boolean verlängern(); // Verlängert das Medium, wenn möglich } // Abstrakte Basisklasse für alle Medien public abstract class Medien implements Ausleihbar { protected String name; protected int id; protected int frist; // Standard-Ausleihfrist in Wochen protected int maxVerlängerungen; // Maximale Anzahl an möglichen Verlängerungen protected int aktuelleVerlängerungen=1; // Aktuelle Anzahl an durchgeführten Verlängerungen protected boolean istAusgeliehen; // Status, ob das Medium ausgeliehen ist // Konstruktor public Medien(String name, int id, int frist, int maxVerlängerungen) { this.name = name; this.id = id; this.frist = frist; this.maxVerlängerungen = maxVerlängerungen; this.aktuelleVerlängerungen = 0; // Initialisierung ohne Verlängerungen // Initialer Status: nicht ausgeliehen } // Getter-Methoden public String getName() { return name; } public int getId() { return id; } // Implementierung der Ausleihbar-Methoden @Override public int getMaxVerlängerungen() { return maxVerlängerungen; } @Override public boolean kannVerlängern() { return aktuelleVerlängerungen < maxVerlängerungen; } @Override public boolean verlängern() { if (kannVerlängern()) { aktuelleVerlängerungen++; return true; // Verlängerung erfolgreich } return false; // Keine Verlängerung mehr möglich } public boolean istAusgeliehen() { return istAusgeliehen; } public void ausleihen() { if (!istAusgeliehen) { istAusgeliehen = true; } else { System.out.println("Das Medium ist bereits ausgeliehen."); } } public void zurückgeben() { istAusgeliehen = false; } // Unterklasse für Bücher public static class Book extends Medien { private String autor; private int erscheinungsjahr; public Book(String name, String autor, int id, int erscheinungsjahr) { super(name, id, 4, 3); // Frist für Bücher ist 4 Wochen, bis zu 3 Mal verlängerbar this.autor = autor; this.erscheinungsjahr = erscheinungsjahr; } // Getter-Methoden für spezifische Eigenschaften von Büchern public String getAutor() { return autor; } public int getErscheinungsjahr() { return erscheinungsjahr; } @Override public String toString() { return "Buch: " + name + " von " + autor + " (ID: " + id + ", Jahr: " + erscheinungsjahr + ")"; } } // Unterklasse für DVDs public static class Dvds extends Medien { private String regisseur; public Dvds(String name, String regisseur, int id) { super(name, id, 7, 0); // Frist für DVDs ist 1 Woche, keine Verlängerung möglich this.regisseur = regisseur; } // Getter-Methoden für spezifische Eigenschaften von DVDs public String getRegisseur() { return regisseur; } @Override public String toString() { return "DVD: " + name + " von " + regisseur + " (ID: " + id + ")"; } } // Unterklasse für CDs public static class Cds extends Medien { public Cds(String name, int id) { super(name, id, 14, 0); // Frist für CDs ist 2 Wochen, keine Verlängerung möglich } @Override public String toString() { return "CD: " + name + " (ID: " + id + ")"; } } // Unterklasse für Brettspiele public static class Brettspiel extends Medien { public Brettspiel(String name, int id) { super(name, id, 14, 0); // Frist für Brettspiele ist 2 Wochen, keine Verlängerung möglich } @Override public String toString() { return "Brettspiel: " + name + " (ID: " + id + ")"; } } // Unterklasse für Videospiele public static class Videospiel extends Medien { private String entwickler; public Videospiel(String name, String entwickler, int id) { super(name, id, 28, 1); // Frist für Videospiele ist 4 Wochen, einmal verlängerbar this.entwickler = entwickler; } // Getter-Methoden für spezifische Eigenschaften von Videospielen public String getEntwickler() { return entwickler; } @Override public String toString() { return "Videospiel: " + name + " von " + entwickler + " (ID: " + id + ")"; } } }