Hi, ich beschäftige mich gerade mit dem Thema Schnittstellen und kann eine Sache nicht ganz nachvollziehen.
Angenommen ich habe ein Interface und drei implementierende Klassen. Nun müssen die implementierenden Klassen alle
Methodensignaturen des Interfaces übernehmen. Warum packt man die nötigen Methoden nicht einfach separat in jede Klasse?
Was für einen Unterschied gibt es zwischen diesen beiden Optionen? Welchen Vorteil hat man durch die Interface Variante?
Du hast es tw. schon selbst gesagt. Durch das Interface definierst du eine Schnittstelle und bist von der Implementierung nicht abhängig. Wenn du gegen das Interface implementierst kannst du beliebig zwischen den Implementierungen wechseln, ohne deinen Code anfassen zu müssen.
Schönes Beispiel ist immer Daten zu speichern. Angenommen du willst in deiner Anwendung 2 Möglichkeiten bereitstellen Daten zu speichern - in einem File und in einer Datenbank.
Jetzt kannst du in deinem Code gegen das Interface implementieren - also als statischen Typ dein Interface angeben - und kannst beliebig zwischen den Implementierungen wechseln
Java:
publicstaticvoidmain(String[] args){DataRepository repo =newDefaultFileDataRepository();// repo = new DefaultDatabaseRepository(); Data data =newData(...);
repos.save(data);Data other = repos.find(42L);}
Im Vorgänger von Java, C++ (wenn man das so sagen kann), gab es Probleme mit der Mehrfachvererbung, das sogenannte Diamant-Problem.
[...]
Deshalb kann man in Java nur von einer Klasse erben, aber beliebig viele Interfaces implementieren.
Ich habe Interfaces im Kontext von gemeinsamen Projekten kennengelernt. Der eine programmiert die Klassen a, b, c, der andere die Klassen x, y, z. Damit die Klassen miteinander kommunizieren können, legt einer die Namen der Methoden mit einem Interface fest. So kann er sagen, die Methode trägt die Bezeichnung "Store" nicht "Save".
Ein weitere Vorteil ist das Boxing:
UsedInterface A = (UsedInterface)ClassInstance;
Die Klasse implementiert das Interface. Man kennt daher die Methoden-Definition und man kann sie aufrufen:
A.Store();
Mit der Instanz der Klasse ist die Methode bereits gekapselt.