Wozu sind interfaces nütze?

hallo,
ich geb ja zu, dass ich noch blutiger anfänger bin, aber ich komme einfach nicht dahinter, wofür interfaces in java gut sein sollen? ich meine, wenn ich dort nur leere methoden definiere und diese dann in der klasse sowieso überschreiben muss, dann kann ich mir das interface doch sparen, oder? oder gibt es da noch einen vorteil, den ich noch nicht kenne? wäre nett, wenn mir das mal jemand erklären könnte, so dass auch ich es verstehe.
mfg
flash

Hallo,

Wenn Du ein Interface in eine Klasse implementierst, dann mußt du alle Methoden überschreiben. D.h. das diese Klasse auf jeden Fall diese Methoden hat.
Wenn du also das Interface Student hast, mit der Methode lernen(), und dann eine Klasse Tutor machst, die dieses Interface implementiert und eine Klasse Hund hast, die dieses Interface implementiert, dann haben beide Klassen auf jeden Fall die Methode lernen(). Was diese Methode tun, ist (kann) je nach Klasse unterschiedlich sein.

bis dann,
Jan

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

ja aber…

Wenn du also das Interface Student hast, mit der Methode
lernen(), und dann eine Klasse Tutor machst, die dieses
Interface implementiert und eine Klasse Hund hast, die dieses
Interface implementiert, dann haben beide Klassen auf jeden
Fall die Methode lernen(). Was diese Methode tun, ist (kann)
je nach Klasse unterschiedlich sein.

alles schön, aber kann ich in diesem fall nicht einfach das interface weglassen und die methode lernen() direkt in der Klasse Tutor und in der Klasse Hund definieren? das wäre doch weniger schreibarbeit als zuerst ein interface mit methoden zu definieren, dieses in der gewünschten klasse zu implementieren und dann sowieso wieder zu überschrieben? oder sehe ich das falsch?
mfg
flash

Ja,

So gesehn hast du schon recht.
Aber wenn eine Klasse ein Interface implementiert, dann ist eine Zusicherung an andere Klassen (o. Programmierer), das diese Klasse garantiert alle Methoden des Interfaces besitzt.

Wenn Du also irgendjemand deine Klasse Hund gibst, und er weiss, daß diese das Interface x hat und deshalb also diese und jene Mthode.

Jan

alles schön, aber kann ich in diesem fall nicht einfach das
interface weglassen und die methode lernen() direkt in der
Klasse Tutor und in der Klasse Hund definieren? das wäre doch
weniger schreibarbeit als zuerst ein interface mit methoden zu
definieren, dieses in der gewünschten klasse zu implementieren
und dann sowieso wieder zu überschrieben? oder sehe ich das
falsch?
mfg
flash

Hallo,

da hast schon recht, das das weniger Aufwand wäre. Aber stell dir mal vor, du hast einen Vector und hast eben in diesem Vector Instanzen der Klassen Hund und Student, um beim obigen Beispiel zu bleiben.

Willst du jetzt ein Element aus dem Vector nehmen und die Methode lernen() aufrufen, hast du ohne interfaces ein Problem. Aus dem Vector bekommst du nämlich nur Instanzen der Klasse Object zurück. Daher mußt du diese Klasse casten. Entweder auf Student oder auf Hund, aber das weißt du ja nicht im vorraus. Oder wäre es zumindest Umständlich das herauszufinden.
Wenn jetzt aber die Klassen Hund und Student ein Interface implementierst, das die Methode lernen() definiert, kannst du die Objekte auf eben dieses Interface casten, und somit die Methode lernen() aufrufen. Egal ob es sich um Hund oder Student handelt.

Gruß
Jochen

Aha, jetzt leuchtet´s mir ein!!!
danke:wink:
mfg
flash

Ein beliebtes Anwendungsgebiet von Java-Interfaces in Kombination mit dem Java-Reflection-API ist auch das Factory-Designpattern (ich glaub so heisst das, schon wieder so lange her :o).

Das kann so aussehen, dass eine Anwendung ein Interface definiert um eine bestimmte Aufgabe zu erfüllen, z. B. INotifyUser. Das Interface definiert eine Methode notify( String ).

In der Konfiguration des Programmes gibt der Anwender jetzt an welche Klasse er zu diesem Zweck verwenden möchte. Das können dann Klassen sein die zum Zeitpunkt der Erstellung der Anwendung noch vollkommen unbekannt waren, Hauptsache sie erfüllen das Interface. Man könnte eine Klasse schreiben die eine SMS schreibt oder eine die ein EMail schreibt.

So kann die Anwendung dann einfach angepasst werden ohne ursprünglichen Code zu verändern.

Diese Vorgangsweise ist bei Java-Anwendungen sehr verbreitet und sehr praktisch.

Grüße, Robert