41 Vererbung versus Komposition (FCoI)

In der objektorientierten Programmierung sind Vererbung und Komposition zentrale Konzepte zur Code-Wiederverwendung und zum Entwurf komplexer Systeme. Beide Ansätze haben ihre spezifischen Anwendungsfälle, Vor- und Nachteile.

41.1 Vererbung in TypeScript

Vererbung ermöglicht es einer Klasse (abgeleitete Klasse), Eigenschaften und Methoden einer anderen Klasse (Basisklasse) zu übernehmen. In TypeScript wird dies mit dem extends-Schlüsselwort erreicht:

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

class Dog extends Animal {
    bark(): void {
        console.log('Woof! Woof!');
    }
}

41.1.1 Vor- und Nachteile der Vererbung

41.1.2 Polymorphismus

41.2 Komposition in TypeScript

Komposition kombiniert Objekte oder Klassen zu komplexeren Strukturen. Es basiert auf der “hat-ein”-Beziehung und bietet mehr Flexibilität als die starre “ist-ein”-Beziehung der Vererbung:

class Engine {
    start(): void {
        console.log('Engine started');
    }
}

class Car {
    private engine: Engine;

    constructor() {
        this.engine = new Engine();
    }

    start(): void {
        this.engine.start();
    }
}

41.2.1 Erweiterte Nutzung der Komposition

41.3 Designprinzipien

41.3.1 Open/Closed-Prinzip und Liskovsche Substitutionsprinzip

41.3.2 Interface-Segregation und Dependency Inversion

41.4 Kombination beider Ansätze

In der Praxis kann oft eine Kombination aus Vererbung und Komposition am sinnvollsten sein:

class Battery {
    provideEnergy(): void {
        console.log('Providing energy');
    }
}

class ElectricCar extends Car {
    private battery: Battery;

    constructor() {
        super();
        this.battery = new Battery();
    }

    start(): void {
        this.battery.provideEnergy();
        super.start();
    }
}

In diesem Beispiel erweitert ElectricCar die Klasse Car (Vererbung) und enthält zusätzlich ein Battery-Objekt (Komposition).