studyklar
GdI 2 · Probeklausur Teil 2 · Aufgabe 7

Interface NachrichtenAgent für E-Mail- und Chat-Agent

Zwei Klassen, ein E-Mail-Agent und ein Chat-Agent, sollen beide Nachrichten senden. Ein Interface legt fest, dass beide eine Methode sende haben. Dann kann eine einzige Methode jeden der beiden Agenten annehmen. Rechts stehen die vier Typen der Lösung als Kästen; was im aktuellen Schritt gemeint ist, ist hervorgehoben. Mit Weiter geht es Schritt für Schritt voran.

Die Aufgabe

Aufgabe 7

Gegeben sind die folgenden beiden Klassen „EMailAgent“ und „ChatAgent“:

public class EMailAgent {     private String mailAdresse;     public EMailAgent(String mailAdresse) {        this.mailAdresse = mailAdresse;    }} public class ChatAgent {     private String chatGruppe;     public ChatAgent(String chatGruppe) {        this.chatGruppe = chatGruppe;    }}

a) Schreiben Sie ein Interface „NachrichtenAgent“, das eine Methode „sende“ deklariert. Diese Methode hat einen Parameter vom Typ String.

b) Es soll sichergestellt werden, dass sowohl EMailAgenten als auch ChatAgenten das in dem Interface definierte Verhalten aufweisen. Beim Senden soll auf der Konsole „Sende Nachricht nachrichtentext an mailAdresse“ bzw. „Sende Nachricht nachrichtentext an chatGruppe“ ausgegeben werden (nachrichtentext, mailAdresse chatGruppe jeweils durch die betreffenden Attributwerte ersetzt). Welche Änderungen müssen in der Klasse EMailAgent und ChatAgent durchgeführt werden? Geben Sie hierfür die geänderten bzw. hinzugefügten Codezeilen an.

c) Schreiben Sie eine Klasse „NachrichtenApp“ mit einer main-Methode und einer statischen Methode „versendeNachricht“, der man als Argument einen EMailAgent oder einen ChatAgent übergeben kann. Diese Methode ruft die sende-Methode des Agenten auf und übergibt Ihr den String „Test-Nachricht“. Legen Sie in der main-Methode ein EMailAgent-Objekt und ein ChatAgent-Objekt an und rufen Sie für beide die Methode „versendeNachricht“ auf.

Gegeben sind zwei Klassen, die noch nichts tun: Sie speichern nur eine Adresse bzw. einen Gruppennamen. Gesucht sind drei Dinge: a) ein Interface mit der Methode sende, b) die Änderungen an den zwei Klassen, damit beide senden können, c) eine kleine App, die beide Agenten ausprobiert.

Merke: Ein Interface (Schnittstelle) ist eine Liste von Methodenköpfen ohne Rumpf. Es sagt, was eine Klasse können muss. Wie sie es macht, schreibt jede Klasse selbst, die das Interface implementiert. Ein Interface ist auch ein Typ: Eine Variable vom Typ des Interface nimmt jedes Objekt einer solchen Klasse auf.
  1. a) Das Interface NachrichtenAgent mit sende(String).
  2. b) Beide Klassen implementieren das Interface und schreiben sende aus.
  3. c) versendeNachricht mit dem Interface als Parametertyp, dann main.

Zu dieser Probeklausur gibt es keine Musterlösung. Die Lösung hier ist selbst erarbeitet und als echtes Programm übersetzt und ausgeführt. Jeder Typ steht in einer eigenen Datei, weil alle public sind.

Das Interface NachrichtenAgent

public interface NachrichtenAgent {     void sende(String nachricht);}

Ein Interface schreibt man wie eine Klasse, nur mit interface statt class. Darin steht der Kopf der Methode sende: Rückgabetyp void (sie gibt nichts zurück), Name, ein Parameter vom Typ String. Statt eines Rumpfs in geschweiften Klammern folgt nur ein Semikolon.

public darf vor der Methode stehen, muss aber nicht: Methoden in einem Interface sind automatisch public und abstrakt (ohne Rumpf). Den Namen des Parameters, hier nachricht, darf man frei wählen. Den Rückgabetyp nennt die Aufgabe nicht; void passt, weil sende nur etwas ausgibt.

Aus Blatt 6, Aufgabe 3 („Interfaces Drucker und Scanner, Kombigerät kann beides“): Ein Interface enthält Methodenköpfe ohne Rumpf. Eine Klasse implementiert es, indem sie diese Methoden ausschreibt.

implements NachrichtenAgent in beiden Klassenköpfen

EMailAgent.java, Zeile 1:

public class EMailAgent implements NachrichtenAgent {

ChatAgent.java, Zeile 1:

public class ChatAgent implements NachrichtenAgent {

„Sicherstellen, dass beide das Verhalten aufweisen“ heißt in Java: Beide Klassen implementieren das Interface. Dazu kommt hinter den Klassennamen implements NachrichtenAgent. Das ist die erste geänderte Zeile in jeder Klasse.

Damit verspricht die Klasse, die Methode sende zu haben. Der Compiler prüft das. Fehlt sie, meldet er: „ChatAgent ist nicht abstrakt und setzt die abstrakte Methode sende(String) in NachrichtenAgent nicht außer Kraft“. Genau das stellt sicher, dass kein Agent ohne sende auskommt.

Noch 5 Schritte bis zum Ergebnis
Den ganzen Lösungsweg sehen Studierende und Lehrende der HS KL. Registriere dich mit deiner Adresse @stud.hs-kl.de oder @hs-kl.de, dann geht es hier direkt weiter.

Die vier Typen

Teil a): das Interface

Abbildung 1Die vier Typen

Teil a): das Interface

interfaceNachrichtenAgentvoid sende(String nachricht);
EMailAgent implements NachrichtenAgentmailAdressesende(…)
ChatAgent implements NachrichtenAgentchatGruppesende(…)
NachrichtenAppmain versendeNachricht(NachrichtenAgent agent)
LegendeOben das Interface, darunter die zwei Agenten, die es implementieren, unten die App.