P
Dexter1997 schrieb:
Sind Schnittstellen wirklich wichtiger als Klassen?
Sie sind was anderes als Klassen. In Java sieht man das sogar an der Syntax ("extends" vs. "implements"). Wichtig ist, dass man die Unterschiede versteht und die Konzepte "Schnittstelle" und "Basisklasse" richtig anwenden kann.
Von einer Basisklasse abzuleiten führt dazu, dass die abgeleitete Klasse die Eigenschaften und Methoden der Basisklasse übernimmt ("Ist-ein-Beziehung"). Bei Bedarf kann sie sie erweitern, ergänzen oder ersetzen.
Von einem Interface abzuleiten führt dazu, dass die abgeleitete Klasse die Verpflichtung übernimmt, das im Interface zugesicherte Verhalten zur Verfügung zu stellen (d.h. die dort definierten Methoden zu implementieren). Sie erbt keine bereits vorhandenen Eigenschaften. Das ist keine Ist-ein-Beziehung, sondern eher ein Vertrag über eine bestimmte Funktionalität.
Mir schien es eher, als wollte Java damit versuchen, krampfhaft die fehlende Mehrfachvererbung zu kompensieren ...
Mehrfachvererbung ist nicht ganz unproblematisch (kurze Zusammenfassung hier: https://de.wikipedia.org/wiki/Mehrfachvererbung). In der "Goldrausch-Phase" von C++ (keiner wusste wirklich Bescheid, aber alle stürzten sich drauf), als endlose und vielfach verzweigte Ableitungshierarchien als Qualitätsmerkmal galten ("da hat sich jemand richtig viel Gedanken gemacht" ), sind Klassendesigns entstanden, die schon sehr bald kein Mensch mehr durchblickte. Nachdem man das untersucht und das Problem verstanden hatte, hat man in später definierte Sprachen (Java, C#) mehr Restriktionen eingebaut.
... da es in den Lehrbüchern als Einleitung immer heißt: "Java erlaubt keine Mehrfachvererbung, aber das ist nicht so schlimm, denn es gibt Schnittstellen [...]
Schade, wenn Lehrbücher das so andeuten, aber Schnittstellen sind definitiv keine Krücke! Es ist vielmehr so, dass vieles, was aus Unkenntnis oder Bequemlichkeit mit Basisklassen gelöst wurde, viel besser (weil nebenwirkungsfrei) mit Schnittstellen gelöst worden wäre.