Abstrakte Klassen und Interfaces implementieren in TypeScript
Abstrakte Klassen und Interfaces implementieren
~15 Min. Lesezeit Zuletzt aktualisiert am 8. August 2026
Unsere Medium-Klasse aus Kapitel 13 kann aktuell DIREKT instanziiert werden (new Medium(...)) – konzeptionell unsinnig, denn ein "Medium" an sich ist abstrakt, es gibt in der echten Welt nur KONKRETE Medien (Bücher, Hörbücher). Abstrakte Klassen erzwingen genau das.
Medium als abstract markieren
export abstract class Medium {
constructor(
public readonly isbn: string,
public titel: string,
// ... restliche Eigenschaften wie in Kapitel 13
) {}
abstract beschreibung(): string; // KEINE Implementierung - nur die Signatur
}
new Medium('123', 'Test'); // Fehler - abstrakte Klassen können NICHT direkt instanziiert werdenabstract class verbietet new Medium(...) – die Klasse existiert NUR als Basis für Vererbung. abstract beschreibung(): string (ohne Funktionskörper!) ZWINGT jede abgeleitete, KONKRETE Klasse, diese Methode SELBST zu implementieren.
export class Buch extends Medium {
// beschreibung() MUSS implementiert werden - sonst Fehler:
// "Non-abstract class 'Buch' does not implement inherited abstract member 'beschreibung'"
beschreibung(): string {
return `${this.titel} (Buch)`;
}
}Achtung: Der Unterschied zu einer normalen (nicht-abstrakten) Basisklasse mit einer "default"-Implementierung: bei abstract PRÜFT der Compiler AKTIV, dass JEDE abgeleitete Klasse die Methode selbst bereitstellt – bei Kapitel 13s Medium.beschreibung() mit echter Implementierung war das Überschreiben in Hoerbuch nur OPTIONAL (override), hier ist es PFLICHT.
Interfaces implementieren mit implements
Ein VERWANDTES, aber unterschiedliches Konzept: eine Klasse kann versprechen, ein Interface zu ERFÜLLEN, mit implements:
export interface Ausleihbar {
istVerfuegbar(): boolean;
ausleihen(): void;
zurueckgeben(): void;
}import { Ausleihbar } from './Ausleihbar.js';
export abstract class Medium implements Ausleihbar {
status: 'verfuegbar' | 'ausgeliehen' = 'verfuegbar';
istVerfuegbar(): boolean {
return this.status === 'verfuegbar';
}
ausleihen(): void {
this.status = 'ausgeliehen';
}
zurueckgeben(): void {
this.status = 'verfuegbar';
}
abstract beschreibung(): string;
}implements Ausleihbar VERPFLICHTET Medium, ALLE Methoden des Interfaces bereitzustellen – der Compiler prüft das SOFORT bei der Klassendeklaration, nicht erst irgendwo später im Code.
Der Unterschied: abstract class vs. interface
| Werkzeug | Eigenschaft |
|---|---|
abstract class | Kann TEILWEISE Implementierung mitbringen (fertige Methoden UND abstrakte Platzhalter gemischt) – eine Klasse kann nur von EINER abstrakten Klasse erben. |
interface mit implements | REINER Vertrag ohne jegliche Implementierung – eine Klasse kann BELIEBIG VIELE Interfaces gleichzeitig implementieren. |
// Eine Klasse kann NUR EINE Basisklasse erben:
class Buch extends Medium { /* ... */ }
// ABER beliebig viele Interfaces gleichzeitig implementieren:
interface Reservierbar {
reservieren(): void;
}
class Buch extends Medium implements Ausleihbar, Reservierbar {
reservieren(): void {
this.status = 'reserviert';
}
}Tipp: Faustregel: abstract class, wenn abgeleitete Typen GEMEINSAMEN Code teilen SOLLEN (wie istVerfuegbar() hier, identisch für Buch und Hörbuch). interface + implements, wenn Sie nur einen VERTRAG durchsetzen wollen ("diese Klasse MUSS diese Methoden haben"), OHNE gemeinsame Implementierung vorzugeben – besonders nützlich, wenn eine Klasse mehrere UNABHÄNGIGE "Fähigkeiten" gleichzeitig haben soll.