40 Erweiterte Vererbung und abstrakte Klassen

TypeScript erweitert JavaScript um objektorientierte Programmierungsfunktionen wie Klassen, abstrakte Klassen und Mixins. Diese Features ermöglichen eine strukturiertere und flexiblere Code-Organisation.

40.1 Abstrakte Klassen und ihre erweiterte Nutzung

Abstrakte Klassen dienen als Basis für andere Klassen und können nicht direkt instanziiert werden. Sie sind ideal, um eine gemeinsame Grundlage für eine Gruppe von Klassen zu schaffen:

abstract class Animal {
    abstract makeSound(): void;
    move(): void {
        console.log('Moving along...');
    }
}

40.1.1 Abstrakte Methoden und Eigenschaften

Eine abstrakte Klasse kann abstrakte Methoden und Eigenschaften enthalten, die in jeder abgeleiteten Klasse definiert werden müssen:

abstract class Vehicle {
    abstract numberOfWheels: number;
    abstract drive(): void;
    honk(): void {
        console.log('Beep beep!');
    }
}

40.1.2 Schutz von Konstruktoren

Der Konstruktor einer abstrakten Klasse kann geschützt werden, um die direkte Instanziierung zu verhindern:

abstract class Base {
    protected constructor() { /* ... */ }
}

40.2 Mixins für Mehrfachvererbung

TypeScript unterstützt keine Mehrfachvererbung direkt, aber Mixins bieten eine alternative Lösung, um Funktionen aus mehreren Quellen zu kombinieren:

class CanSayHi {
    sayHi() {
        return `Hello, my name is ${this.name}`;
    }
}

class Person {
    name: string;
    constructor(name: string) {
        this.name = name;
    }
}

applyMixins(Person, [CanSayHi]);

const person = new Person("John Doe");
console.log(person.sayHi()); // "Hello, my name is John Doe"

40.2.1 Typsicherheit in Mixins

Um Typsicherheit in Mixins zu gewährleisten, ist es oft nützlich, Interfaces zusammen mit Mixins zu verwenden:

interface CanSayHi {
    sayHi(): string;
}

class Person implements CanSayHi {
    // Rest der Klasse
}

40.2.2 Herausforderungen und Best Practices