Wozu sind Interfaces gut?

Status
Nicht offen für weitere Antworten.

Reality

Top Contributor
Hi,
ich habe mir verschiedene Quellen über Interface durchgelesen, aber es will einfach nicht in meine Birne rein, für was das gut ist!

Mein Wissensstand:
- Wenn man ein Interface in eine Klasse implementiert, kann man keine Instacz erzeugen.
- Die Methoden im Interface müssen kein Körper haben (wozu gibt´s abstract?!)
- Man kann kein Konstruktor in Interface einbauen
- Mehrere Klassen können die Methoden des Interfaces implementieren und es auf ihre Wünsche anpassen (was hindert mich daran eigene Methoden zu erstellen?!)

Besonders der letzte Punkt soll die Mehrfachvererbung in C++ ersetzen, aber ich sehe nur, wie man Methoden ohne Körper vererben kann (was auch mit abstract möglich ist) und um sie anschliessend in einer anderen Klasse zu initialisieren (was bringt das) und in einer anderen Klasse die Methode des Interfaces auch anders initialisieren kann.

Wozu braucht man das? Man kann doch den Konstruktor einer Superklasse überschreiben!

Liebe Grüße
Reality
 

Jaraz

Bekanntes Mitglied
Durch Vererbung spezialisierst du Klassen.

Mit einem Interface kannst du erreichen das im Grunde vollkommen verschiedene Objekte eine oder mehrere gemeinsame Verhaltensweisen besitzen.

Beispiel:

Object Auto und Object Dienstleistung
Beide eigentlich vollkommen verschieden, aber nun möchtest du ein Haushaltsbuch führen. Dieses Haushaltsbuch enthält eine Methode addPosten(Posten p).

Wie kannst du es nun erreichen, das du addPosten ein Auto und eine Dienstleistung hinzufügen kannst?

Entweder du leitest beide von Posten ab, was schwer werden könnte, weil die beiden wahrscheinlich vollkommen verschiedene Superklassen haben. z.b. Fahrzeug und Vorgang.
Oder du schreibst ein Interface Posten mit z.b. der Methode public double getKosten(); Dieses Interface implementierst du bei beiden Klassen und kannst somit alle Objekte der beiden Klassen, mit der Methode addPosten übergeben.

Abschließend kannst du z.B. über ein PostenArray im Haushaltsbuch laufen und mit der Methode getKosten() deine Ausgaben addieren.

Fazit:
Solange 2 Klassen nicht stark voneinander abhängig sind, sind Interfaces die elegantere Methode Gemeinsamkeiten zu definieren.

Abstract besagt einfach nur das die Klasse oder das Interface so nicht funktionieren und weiter spezialisiert werden müssen.

Gruß Jaraz
 
B

bygones

Gast
Mein lieblingsbeispiel eines Interfaces ist das Interface Comparable.

Wie schon richtig gesagt dient ein Interface dazu eine Schnittstelle zu definieren. Wenn du versch. Objekte hast die ein und das selbe Interface implementieren musst du dich nicht kümmern, wie die einzelnen Objekte realisiert sind - was du weißt ist, dass sie alle das Interface implementieren und daher z.b. eine bestimmte Methode haben...

Am Bsp Comparable:

In der Datenstruktur TreeSet werden Objekte sortiert in eine Art Liste eingefügt. Die Frage ist nun woher weiß das TreeSet wie die Objekte sortiert werden müssen - die Antwort ist einfach: Alle diese Klassen müssen das Interface Comparable implementieren - das verlangt, das die Methode compareTo implementiert wird die sagt ob ein Objekt größer, kleiner oder gleich einem anderen ist.

Somit ist dem TreeSet gelinde gesagt schnurz egal was für Objekte es sortieren soll bzw. vor allem wie die einzelnen Objekte sortiert werden - es weiß nur, es gibt eine compareTo Methode und die sagt mir wie ich sortieren soll.

Wie oben gut gesagt, sie dienen dazu (untersch.) Objekten eine gemeinsame Eigenschaft zu geben !
 
B

bygones

Gast
Eine Sache noch bei der Interfaces ihre Genialität zeigen:

Stell dir vor du hast ein Programm das Daten aus einer Datenbank importiert. Das schreibst du auch so in dein Programm. Nun benutzt jemand dein Programm, hat keine Datenbank und würde gerne seine Daten aus einer Datei (Flatfile) importiere --> Das Programm muss komplett umgeschrieben werden.
Der nächste der es nutzen will hat nun wieder eine andere Art von Datenquelle --> wieder muss alles geändert werden.

Arbeitest du mit Interfaces hast du keine Probleme damit. Du sagst einfach:
"Jede Klasse die Daten für mein Programm bereitstellen will muss das XYZ Interface implementieren".

In dem Programm schreibst du dann nur das Interface als Datenbeschaffer und nicht deine Datenbankklasse.
Wenn jetzt einer mit einem Flatfile kommt, muss er nur eine Klasse schreiben die das Interface implementiert und schwupps läuft alles ohne das Hauptprogramm anzufassen :roll:

Wunderbare Sache dein programm flexibel und leicht erweiterbar zu machen....
 

Reality

Top Contributor
Kleine Frage:
Wenn zwei unterschiedliche Klassen geladen werden mit demselben Methoden-Namen, dann geht das doch auch?!

In meinem Buch habe ich Beispiele, die ich mit der obigen genannten Möglichkeit verwirklichen könnte.

Liebe Grüße
Reality
 
B

Beni

Gast
Es gibt dann einfach nur eine Methode. D.h. egal wie die Klasse angeschaut wird, es wird immer nur diese eine Methode aufgerufen.

Das funktioniert natürlich nur gut, wenn die Methode in beiden Interfaces dasselbe machen sollte.

Folgendes Beispiel funktioniert nur auf den ersten Blick:
Code:
public interface A{
  // String herstellen, der nur aus "A" und "a" besteht
  public String createString();
}
Code:
public interface B{
  // String herstellen, der nur aus "B" und "b" besteht
  public String createString();
}
Code:
public class C implements A, B{
  public String createString(){
    ... // was soll jetzt hier geschehen? Das widerspricht sich doch.
  }
}

Sollten die Methoden gleichheissen, aber einen anderen Rückgabewert haben (z.B. public int createValue() und public float createValue()), kann man nicht mal mehr kompilieren.
 

Reality

Top Contributor
Nein, du hast mich falsch verstanden. Ich meinte das ganze ohne Interface zu machen.

Code:
class A
{
  public test()
  {
  Individueller Code
  }
} 

class B
{
  public test()
  {
  Anderer individueller Code
  }
} 

class Tetster
{
  public static void main (String args[])
  {
  A a= new A();
  B b= new B();
  
  a.test();
  b.test();
  }
}

Macht doch ungefähr dasselbe wie ein Interface?
2 gleichnamige Methoden, aber die Methoden machen verschiedene Dinge.

Liebe Grüße
Reality
 
B

Beni

Gast
Sorry, lesen sollte man können :roll:

Also: nehmen wir mal an, irgendwo gibt es eine Methode, die "test()" benötigt.
Wenn man das A und das B so nimmt, wie Du geschrieben hast, muss man einmal "runTest( A a )" und einemal "runTest( B b )" schreiben.

Das ist viel Schreibarbeit, und schlecht erweiterbar (wenns jetzt noch Klasse C, D, E, ... gibt, huiii... ).

Der Vorteil von einem Interface ist, dass man nur noch ein "runTest( TestInterface ti )" schreiben muss.


Bis auf die Tatsache dass A und B "test" besitzen, haben sie nichts gemeinsam. Ebensogut könnte A eine Methode "blupp" und B "judihui" haben, es würde keinen Unterschied machen.
 

Reality

Top Contributor
Hallo,
Beni hat gesagt.:
Wenn man das A und das B so nimmt, wie Du geschrieben hast, muss man einmal "runTest( A a )" und einemal "runTest( B b )" schreiben.
Hoffentlich nerve ich nicht, wenn ich frage, was du mit "run Test(B b)" meinst.
Das ist viel Schreibarbeit, und schlecht erweiterbar (wenns jetzt noch Klasse C, D, E, ... gibt, huiii... ).

Entweder liefert das Buch keine guten Beispiele oder ich kapier das nicht:

Ich habe ein Interface mit den Methoden push() und pop() geschrieben, die dann auch in anderen Klassen initialisiert wurden und so sieht das dann im Beispiel-Code aus, wenn die geladen werden. Meiner Meinung nach ist das noch mehr Code:


Code:
//Erzeuge eine interface-Variable und greife über diese auf Stacks zu

class IFTest3 {
  public static void main(String[] args) {
  //Erzeuge eine Schnittstellen-Verweisvariable
  IntStack mystack;
  DynStack ds= new DynStack(5);
  FixedStack fs = new FixedStack(8);

  mystack = ds; //Lade dynamischen Stack
  //Lege einige Zahlen auf dem Stack ab
  for(int i=0; i<12; i++) mystack.push(i);

  mystack = fs; //Lade festen Stack
  for(int i=0; i<8; i++) mystack.push(i);

  mystack = ds;
  System.out.println("Werte im dynamischen Stack: ");
  for(int i=0; i<12; i++)
    System.out.println(mystack.pop());

  mystack = fs;
  System.out.println("Werte im festen Stack: ");
  for(int i=0; i<8; i++)
    System.out.println(mystack.pop());
  }
}

Liebe Grüße
Reality
 
B

Beni

Gast
1. runTest( B b ): "Run Methode test von b (einem Objekt vom Typ B)"

2. Es ist nur auf den ersten Augenblick mehr Code:
Beantworte kurz die Fragen im Quellcode.
Code:
  mystack = ds;

// #######
// Kannst du sagen, was mystack jetzt ist (dynamisch oder fest)? Hätte die Antwort (dynamisch oder fest) eine Bedeutung?

  System.out.println("Werte im dynamischen Stack: ");
  for(int i=0; i<12; i++)
    System.out.println(mystack.pop());

  mystack = fs;

// #######
// Kannst du sagen, was mystack jetzt ist (dynamisch oder fest)? Hätte die Antwort (dynamisch oder fest) eine Bedeutung?

  System.out.println("Werte im festen Stack: ");
  for(int i=0; i<8; i++)
    System.out.println(mystack.pop());

Es ist beides mal: "Mit viel Aufwand könnte man es herausfinden, aber es hat keine Bedeutung".

Es ist zweimal derselbe Code (for... println), der aus einem Stack ausliest, und Ergebnis ausdruckt.
Egal ob es ein dynamischer, ein fester oder sonst ein Stack ist: der Code um einen Stack auszulesen bleibt gleich, unabhängig wie der Stack aufgebaut ist.

Der Witz daran ist, dass ein Stück Code fertig geschrieben ist, und nie mehr verändert werden muss.
 

Reality

Top Contributor
Hi Beni!
Es ist mir jetzt klarer. Dann sind Interfaces besonders geeignet, wenn man den Code weiterreicht oder in einem anderen Projekt wiederverwenden will?

Liebe Grüße
Reality
 
B

Beni

Gast
Reality hat gesagt.:
Dann sind Interfaces besonders geeignet, wenn man den Code weiterreicht oder in einem anderen Projekt wiederverwenden will?

genau.gif


Es muss nichteinmal ein anderes Projekt sein. Schon wenn ein eigenes Projekt genug gross ist (ich meine damit alles mit mehr als 20 Klassen), lohnt sich der Einsatz von Interfaces.
 

Tobias

Top Contributor
Noch mal zu deiner Frage, ob es nicht auch ginge, wenn einfach zwei Klassen den selben Methodennamen benutzen... - ja, das geht:

Code:
class A { 
    methode() {
        // Implementierung 1
    }
}

class B {
    methode() {
        // Implementierung 2
    }
}

ABER: Du kannst niemanden dazu zwingen, eine Methode methode() in seine Klasse einzubauen. Und - noch schlimmer - die Klassen A und B besitzen keinen gemeinsamen Obertyp, das heißt, dass du zum Beispiel nicht verschiedene Instanzen von A und B in eine Collection packen, aufrufen und dann die Methode methode() aufrufen kannst - das läßt der Compiler nicht zu (denn, auf welches Objekt soll er den Casten? auf A oder auf B?).
Mit Interfaces steht ein gemeinsamer Obertyp zur Verfügung (der des Interfaces), obiges Szenario ist damit kein Problem mehr.
Und man kann fremde Programmierer dazu verdammen, die gewünschten Methoden zu implementieren :bae:!

mpG
Tobias
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Wozu sind Annotations da? Java Basics - Anfänger-Themen 3
M Wozu dient Interfaces? Java Basics - Anfänger-Themen 6
berserkerdq2 Wozu benötigt man den BiPredicate, kann ich nicht einfach eine normale Methode nutzen, statt BiPredicate? Java Basics - Anfänger-Themen 3
N Wozu nutzt man in der Main Methode das args Array? Java Basics - Anfänger-Themen 10
S Vererbung Abstrakte Methoden: Wozu das Ganze?! Java Basics - Anfänger-Themen 7
W Stackabarbeitung - Wozu dient das "True" ? Java Basics - Anfänger-Themen 1
H abstract - Wozu? Java Basics - Anfänger-Themen 6
T Erste Schritte Endlosschleife & wozu braucht man /* und */ Java Basics - Anfänger-Themen 19
V OOP Wozu Objekt erstellen? Java Basics - Anfänger-Themen 2
G Wozu ist die Methode offsetByCodePoints(int, int) beim StringBuilder sinnvoll? Java Basics - Anfänger-Themen 1
G wozu dient getContentPane()? Java Basics - Anfänger-Themen 1
M Wozu Upcasting? Am Beispiel List = ArrayList Java Basics - Anfänger-Themen 2
P Wozu brauche ich (this.)? Java Basics - Anfänger-Themen 3
F Wozu braucht man array list? Java Basics - Anfänger-Themen 29
U Wozu dient ein Vector in Java? Java Basics - Anfänger-Themen 6
B Wozu Observer? Java Basics - Anfänger-Themen 9
D Sinn von Interfaces - Wozu? Java Basics - Anfänger-Themen 9
J Datentypen Array in enum, ?? Wozu ?? Java Basics - Anfänger-Themen 3
J Wozu werden die anonyme Klassen verwendet? Java Basics - Anfänger-Themen 9
F Wozu ist Java gut? Java Basics - Anfänger-Themen 7
H Maps? Wozu? Nutzen? Java Basics - Anfänger-Themen 3
0 Wozu braucht man Generics? Java Basics - Anfänger-Themen 1
V wozu ist das 'L' beim long notwendig ? Java Basics - Anfänger-Themen 5
A wozu ant? Java Basics - Anfänger-Themen 12
S Wozu dient die Main Class? Java Basics - Anfänger-Themen 3
Y Wann / Wozu inner class Java Basics - Anfänger-Themen 3
S Desginfrage Interface - aber wozu eigentlich? Java Basics - Anfänger-Themen 2
E Wozu dienen Schnittstellen? Java Basics - Anfänger-Themen 16
N Wozu Applications? Java Basics - Anfänger-Themen 8
M Methode bekommt ein Objekt der Klasse als Parameter. Wozu? Java Basics - Anfänger-Themen 4
B Hashcode?Was ist das und wozu? Java Basics - Anfänger-Themen 2
R Wozu Interfaces ? Java Basics - Anfänger-Themen 5
G Konstruktoren (was, wozu, wieso, warum) Java Basics - Anfänger-Themen 4
K Warum sind Werte in den Feldern ? Java Basics - Anfänger-Themen 2
T Methode, die prüft ob in einem Int-Array maximal 2 Zahlen enthalten sind, die größer als ihr Vorgänger sind Java Basics - Anfänger-Themen 5
T Collections Sind Subklassen-Objekte in Listen mit Generics erlaubt? Java Basics - Anfänger-Themen 16
berserkerdq2 Wie würde man einen regulären Ausdruck in Java schreiben, der prüft, dass zwei bestimtme Zahlen nicht nebeneinadner sind? Java Basics - Anfänger-Themen 3
milan123 das ist meine aufgabe ich hab das problem das bei mir Wenn ich die Richtung der Linien verändern will und drei davon sind richtig, verändere ich die 4 Java Basics - Anfänger-Themen 3
Igig1 Welche Werte sind als default Werte in einem Array, der als Datentyp eine Klasse hat? Java Basics - Anfänger-Themen 1
X Wie erreiche ich, dass ein Robot weitere Attribute hat, die nicht materialisiert sind, sondern nur über get/ set-Methoden simuliert sind? Java Basics - Anfänger-Themen 1
M Wie können Klassen nicht-materialisierte Attribute haben, die nur über get/ set-Mehoden simuliert sind? Java Basics - Anfänger-Themen 6
C Sind die while-Schleifen richtig in for-Schleifen ersetzt worden? Java Basics - Anfänger-Themen 8
S Sind unten stehende Anweisungen kompilierbar? Java Basics - Anfänger-Themen 7
M Wie kann ich Werte die in einer While Schleife sind weiter genutzt werden? Java Basics - Anfänger-Themen 7
CptK Generics: Klassen die Interface implementieren, aber selbst nicht das Interface sind Java Basics - Anfänger-Themen 8
mhmt_03 dafür sorgen, dass im JTextfield nur zahlen eingebbar sind Java Basics - Anfänger-Themen 9
M Warum werden character, die Leerzeichen sind, nicht korrekt verarbeitet? Java Basics - Anfänger-Themen 2
M Scannen von *.txt - Dateien; wo sind der oder die Fehler? Java Basics - Anfänger-Themen 4
L Methode implementieren, Parameter die übergeben werden sind final Java Basics - Anfänger-Themen 4
S Laufzeit Quicksort wenn alle Elemente gleich sind Java Basics - Anfänger-Themen 4
B Sind meine If-Statements richtig angesetzt ? Java Basics - Anfänger-Themen 27
A Haben KNNs ein Gedächtnis, lernen etwas oder verändern sich, während sie nicht trainieren, aber aktiv sind? Java Basics - Anfänger-Themen 3
M prüfen ob alle array werte gleich sind Java Basics - Anfänger-Themen 27
H Was sind Package bei eclipse? Java Basics - Anfänger-Themen 1
V NullPointerException, wenn Key und Value null sind Java Basics - Anfänger-Themen 2
G Überprüfen ob alle Ziffern von 1-9 in einem Integer vorhanden sind Java Basics - Anfänger-Themen 6
D Zwei Strings sind gleich bei if aber nicht true Java Basics - Anfänger-Themen 2
J Strings sind gleich werden aber ungleich ausgewertet Java Basics - Anfänger-Themen 2
H Array mit Zahlen die durch 3 und 5 teilbar sind erstellen Java Basics - Anfänger-Themen 13
J Klassen Math && Random: wie zufällig sind Zufallszahlen? Java Basics - Anfänger-Themen 19
L Prüfe, ob die im String Array enthaltenen Strings aufsteigend sind. Java Basics - Anfänger-Themen 19
D Fehlermeldung obwohl Variablen bereits deklariert sind? Java Basics - Anfänger-Themen 14
C Tabs in JTabbedPane wechseln, wenn Tabs in eigenen Klassen sind Java Basics - Anfänger-Themen 2
Azazel Wie wichtig sind Castings in Java ? Java Basics - Anfänger-Themen 1
S Was sind Java Beans? Java Basics - Anfänger-Themen 7
S Erste Schritte Generische Klassen sind toll ....aber warum sollte ich das je benutzen? Java Basics - Anfänger-Themen 3
J Prüfen ob Arrays nur mit einem Wert belegt sind Java Basics - Anfänger-Themen 3
K Erste Schritte switch - Warum sind long/float/double/... nicht erlaubt? Java Basics - Anfänger-Themen 5
M Wie sicher sind Daten im Java Programm? Java Basics - Anfänger-Themen 9
T Wie vergleiche ich die Jahre aus der while Schleife die in ( public class) fuer cbx geschrieben sind Java Basics - Anfänger-Themen 5
P Wieviele Tage seit dem Datum vergangen sind Java Basics - Anfänger-Themen 5
P OOP Testen ob 2 Strings gleich sind Java Basics - Anfänger-Themen 8
M Welche externen Bibliotheken sind in Java sehr zu empfehlen? Java Basics - Anfänger-Themen 4
? Wie sind ESCAPE-Sequenzen (z.B \f für einen Seitenvorschub) richtig anuwenden? Java Basics - Anfänger-Themen 3
M Warum sind Strings Immutable? Java Basics - Anfänger-Themen 7
S Werte aus SingeltonKlasse sind manchmal =0 &manchmal !=0 Java Basics - Anfänger-Themen 1
M Sind solche boolean Anweisen empfehlenswert? Java Basics - Anfänger-Themen 3
F Scanner + Stringbuilder geben leeren String aus wenn Umlaute enthalten sind Java Basics - Anfänger-Themen 29
M String überprüfen ob nur Buchstaben enthalten sind? Java Basics - Anfänger-Themen 10
Kenan89 Wo sind die Java Standard Library Source Codes zu finden? Java Basics - Anfänger-Themen 5
L JDK installieren Sind in src.zip tatsächlich die verwendeten Klassen? Java Basics - Anfänger-Themen 7
L Byte[] to String, doch bits sind gespiegelt (MSB/LSB) Java Basics - Anfänger-Themen 3
B Funktionen programmieren, die im Hintergrund aktiv sind Java Basics - Anfänger-Themen 2
S Von byte[] nach String zurueck nach byte[]. Arrays sind nicht identisch :( Java Basics - Anfänger-Themen 6
C hashCode() bei Klassen, die nicht immutable sind Java Basics - Anfänger-Themen 27
C Erste Schritte felder, die public final sind Java Basics - Anfänger-Themen 6
D Warum sind Generics mit Vorsicht zu genießen? Java Basics - Anfänger-Themen 6
E Was sind Javascript und Java EE? Java Basics - Anfänger-Themen 7
S Wie performance lastig sind rekursionen Java Basics - Anfänger-Themen 13
C Nach Java-Installation sind Befehle erfolglos Java Basics - Anfänger-Themen 4
B Variablen Warum sind die blau Java Basics - Anfänger-Themen 2
L Liste aller Klassen die in einem Paket sind Java Basics - Anfänger-Themen 7
S Warten bis alle Threads fertig sind Java Basics - Anfänger-Themen 12
M Erste Schritte zwei Buchstaben die im String enthalten sind ausgeben Java Basics - Anfänger-Themen 21
J Drei Errors sind drei zuviel! Java Basics - Anfänger-Themen 25
RySa Input/Output Datei kann nicht gelöscht werden, obwohl Streams geschlossen sind. Java Basics - Anfänger-Themen 2
H Wieviele Objekte gleichzeitig sind sinnvoll? Java Basics - Anfänger-Themen 4
S Dezimale Konstanten sind immer positiv oder null - was heisst das den genau? Java Basics - Anfänger-Themen 2
D Strings sind ungleich obwohl sie in der Ausgabe gleich sind Java Basics - Anfänger-Themen 10
D Sind Enums typsichere Konstanten? Java Basics - Anfänger-Themen 15

Ähnliche Java Themen

Neue Themen


Oben