- 1 Section
- 10 Lessons
- unbegrenzt
- Objektorientierte Programmierung (OOP)10
Abstrakte Klassen und Interfaces
In den letzten Lektionen hast du Vererbung (L5) und Polymorphismus (L6) gelernt. Beides funktioniert nur dann gut, wenn man weiß welche Methoden eine Klasse haben muss. Genau das machen abstrakte Klassen und Interfaces: sie definieren Verträge ohne konkrete Implementierung.
Diese Lektion klärt den oft verwechselten Unterschied zwischen abstrakter Klasse und Interface, zeigt wann du welches brauchst, und behandelt moderne Entwicklungen wie Default-Methoden in Java 8+. Eines der Themen, das in Bewerbungsgesprächen garantiert abgefragt wird.
1) Das Problem mit normalen Klassen
In L6 hatten wir eine Tier-Klasse mit Methode laut_geben(), die in der Basis-Implementierung nur "???" ausgab. Das ist nicht ideal:
- Niemand sollte je ein „pures"
Tiererzeugen können – es existiert nur als abstrakter Begriff - Die Methode
laut_geben()hat keine sinnvolle Default-Implementierung – jede Unterklasse muss sie definieren - Es gibt keine Garantie, dass jede Unterklasse die Methode überschreibt – wenn nicht, kommt
"???"
Die Lösung: Abstraktion. Eine abstrakte Klasse kann nicht direkt instanziiert werden, und kann Methoden ohne Implementierung haben, die jede Unterklasse zwingend ausfüllen muss.
2) Abstrakte Klassen
Eine abstrakte Klasse ist eine Klasse, die mit dem Schlüsselwort abstract markiert ist. Du kannst sie nicht mit new erzeugen – nur als Basisklasse nutzen. Sie kann:
- Konkrete Methoden mit voller Implementierung enthalten (wie normale Klassen)
- Abstrakte Methoden ohne Implementierung – nur Signatur, kein Body
- Felder (Attribute) – auch private, mit Zustand
- Einen Konstruktor (der aber nur von Unterklassen aufgerufen wird)
Sobald eine Klasse nur eine abstrakte Methode hat, ist sie selbst auch abstrakt. Wenn Hund die laut_geben() nicht überschreiben würde, müsste Hund selbst abstract markiert werden.
In Python erreicht man das mit dem ABC-Modul (Abstract Base Class):
3) Interfaces
Ein Interface ist ein noch reduzierteres Konzept: es definiert nur Methoden-Signaturen ohne Implementierung. Kein Konstruktor, kein Zustand, keine Felder (zumindest klassisch). Pur ein Vertrag:
Zahlbar verarbeitet werden.Java nutzt implements für Interfaces (nicht extends wie für Klassen). Eine Klasse kann nur eine Klasse erweitern, aber beliebig viele Interfaces implementieren. Das umgeht das Diamond-Problem (siehe L5).
4) Direkter Vergleich
Die zwei Konzepte überschneiden sich teilweise, sind aber strukturell unterschiedlich. Hier eine Übersicht der Unterschiede:
default-Methoden mit Implementierung haben. Trotzdem bleibt der grundsätzliche Unterschied: abstrakte Klassen halten Zustand, Interfaces nur Verhalten.5) Default-Methoden in Java 8+
Seit Java 8 dürfen Interfaces auch Default-Implementierungen für Methoden haben. Das wurde eingeführt, damit man bestehende Interfaces erweitern kann, ohne alle Implementierungen zu brechen:
Damit nähern sich Interfaces den abstrakten Klassen an. Java hat zusätzlich seit Version 9 auch private-Methoden in Interfaces, seit Version 15 auch static-Helper-Methoden. Aber Achtung: Interfaces können weiterhin keinen Zustand haben. Der Hauptunterschied bleibt.
6) Wann was nehmen?
Die wichtigste Frage in der Praxis: nehme ich abstrakte Klasse oder Interface? Hier ein Entscheidungsbaum:
List-Interface in Java – viele Implementierungen (ArrayList, LinkedList) gleichen Vertrag.Collection, Iterable, Comparable, Runnable – alles Interfaces. AbstractList, AbstractMap – abstrakte Klassen die das Interface teilweise vorimplementieren. Dieses Muster (Interface + Abstract-Helper) ist sehr verbreitet.7) Typische Use-Cases
AbstractCar mit gemeinsamen Methoden, SportsCar und SUV als Spezialisierungen.Printable, Comparable, Iterable – Verhalten quer durch verschiedene Domänen.Serializable, Cloneable in Java. Sagen dem System: „dieses Objekt kann das".8) Python: hat Python überhaupt Interfaces?
Python hat keine echten Interfaces als Sprach-Feature. Stattdessen gibt's drei verschiedene Wege:
- Duck Typing: einfach davon ausgehen, dass das Objekt die Methoden hat. Wenn nicht, fliegt's zur Laufzeit (siehe L6).
- ABC + abstractmethod: abstrakte Klassen, die als Interface-Ersatz fungieren.
- typing.Protocol (Python 3.8+): „strukturelle Subtypen" – Klassen die die richtigen Methoden haben, ohne explizit zu erben.
9) JavaScript / TypeScript
JavaScript hat klassisch keine Interfaces – die Sprache ist dynamisch. TypeScript bringt aber starkes Interface-Konzept:
TypeScript-Interfaces sind strukturell – jedes Objekt mit den richtigen Properties ist automatisch ein Person. Das ist eine Mischung aus Pythons Duck Typing und Javas explizitem Vertrag. Mehr in K42b JavaScript.
10) Häufige Klausurfragen
Was in IHK-Prüfungen und Bewerbungsgesprächen zu Interfaces und abstrakten Klassen gefragt wird:
- „Was ist eine abstrakte Klasse?" → Klasse die nicht direkt instanziiert werden kann, kann abstrakte Methoden enthalten
- „Was ist ein Interface?" → reine Methoden-Vertrag ohne Zustand, kann von vielen Klassen implementiert werden
- „Unterschied zwischen abstract und interface?" → Tabelle aus Abschnitt 4 erinnern: Zustand, Konstruktor, Mehrfach-Implementation
- „Wann nimmst du was?" → abstract bei is-a + gemeinsamem Code; interface bei „can do"-Fähigkeit oder Mehrfach
- „Warum hat Java Interfaces wenn es schon abstract gibt?" → Mehrfach-Implementierung; vermeidet Diamond-Problem
- „Was ist eine Default-Methode?" → Java 8+ Feature: Interface-Methode mit Implementierung; erlaubt Erweiterung bestehender Interfaces
- „Was ist ein Marker-Interface?" → leeres Interface zur Typ-Markierung, z.B.
Serializable - „Kann ein Interface von einem anderen Interface erben?" → ja, mit
extends; ein Interface kann sogar mehrere andere erweitern
Zusammenfassung
Abstrakte Klasse: nicht instanziierbar, kann abstrakte + konkrete Methoden + Felder + Konstruktor haben. Für is-a-Hierarchien mit gemeinsamem Code. Interface: reiner Vertrag, nur Methodensignaturen, keine Felder (außer Konstanten), keinen Konstruktor. Eine Klasse extends max. eine Klasse, implements viele Interfaces. Java 8+ bringt Default-Methoden in Interfaces – Implementierung erlaubt, aber kein Zustand. Faustregel: abstrakte Klasse für gemeinsame Implementierung, Interface für Capability-Verträge. Python nutzt ABC oder Protocol, TypeScript hat strukturelle Interfaces. Bewerbungs-Klassiker: „Unterschied zwischen abstract und interface" – beherrschen!
