# Nachdenkzettel: Interfaces

## 1. Eine neue Methode in Notification Channel 

Gegeben ist `class EmailChannel implements NotificationChannel`. Jetzt fügen Sie eine neue Methode in das Interface `NotificationChannel` ein.
   
   ```java
    public interface NotificationChannel {
        void send(String recipient, String message);
        void schedule(String recipient, String message, LocalDateTime when); // neu
    }
   ```

Was passiert jetzt mit Klassen wie:
   
   ```java
    public clas EmailChannel implements NotificationChannel {
        @Override
        public void send(String recipient, String message) {
            System.out.println("Mail an " + recipient + ": " + message);
        }
    }
   ```
Welche Fehlermeldung erhalten Sie beim Kompilieren? Und warum? 

## 2. Neue Push-Nachrichten

Sie möchten einen weiteren Kanal einführen, zum Beispiel Push-Nachrichten. Definieren Sie ein Interface `PushChannel`, das eine Methode zum Versenden einer Push-Nachricht an ein Gerät enthält z. B. `sendPush(String deviceId, String title, String message)`. 

Orientieren Sie sich dabei daran, wie andere Push-Dienste funktionieren könnten. Implementieren Sie anschließend eine Klasse `SimplePush`, die dieses Interface umsetzt. 

Welche Gemeinsamkeiten haben `PushChannel` und `NotificationChannel`? Wo unterscheiden sie sich?

Denken Sie an typische Eigenschaften von Push-Nachrichten im Vergleich zu E-Mail oder SMS.

## 3. Vererbung von Interfaces

Sie sollen untersuchen, wie Interfaces voneinander erben können. Definieren Sie zunächst ein Interface `BaseNotification` mit einer Methode:

   ```java
    void send(String recipient, String message);
   ```

Leiten Sie davon ein zweites Interface `PriorityNotification` ab, das die Methode

   ```java
    void sendWithPriority(String recipient, String message, int priority);
   ```
ergänzt.

Implementieren Sie anschließend eine Klasse `MobileAlert`, die `PriorityNotification` umsetzt. Die Klasse muss beide Methoden bereitstellen, also die geerbte Methode aus `BaseNotification` und die neue Methode aus `PriorityNotification`.

Testen Sie die Klasse kurz in einer main-Methode. Erzeugen Sie ein Objekt von `MobileAlert` und rufen Sie beide Methoden auf. Zeigen Sie dadurch, wie der erweiterte Vertrag eines Interfaces in einer konkreten Klasse wirksam wird.

## 4. Abstrakte Klassen und Interfaces in Ihrem Projekt
a) Begründen Sie, warum Sie abstrakte Klasse bzw. Interfaces einsetzen. Gehen Sie konkret auf Aspekte wie „Vertrag“, „Implementierungsanteil“, Polymorphie und Wiederverwendung in Ihrem Projekt ein.
b) Nehmen Sie eine KI/LLM Ihrer Wahl und diskutieren Sie die Vor- und Nachteile Ihres Ansatzes. Beschreiben Sie mögliche Änderungen/Erweiterungen in Ihrem Projekt und diskutieren Sie, wie gut Ihre Struktur aus abstrakten Klassen und/oder Interfaces damit zurechtkommt.