TypeScript - Abstrakte Klassen

Hallo da draußen, angehende Programmierer! Heute machen wir uns auf eine aufregende Reise in die Welt von TypeScript und erkunden eine seiner leistungsstarken Funktionen: Abstrakte Klassen. Machen Sie sich keine Sorgen, wenn Sie neu im Programmieren sind; ich werde Sie durch dieses Konzept Schritt für Schritt führen, genau wie ich es in den letzten Jahren für unzählige Schüler getan habe. Also, tauchen wir ein!

TypeScript - Abstract Classes

Was sind Abstrakte Klassen?

Bevor wir uns den Details abstrakter Klassen zuwenden, beginnen wir mit einer einfachen Analogie. Stellen Sie sich vor, Sie sind bei einem Autohaus und sehen ein Schild, das "Fahrzeug" sagt. Sie können actually kein "Fahrzeug" kaufen, weil es zu allgemeingültig ist. Sie müssen eine spezifische Art von Fahrzeug wählen, wie ein Auto, einen Lkw oder ein Motorrad. In der Programmierung ist eine abstrakte Klasse wie dieses allgemeine "Fahrzeug" Konzept - sie ist eine Vorlage für andere Klassen, aber Sie können kein Objekt direkt daraus erstellen.

Abstrakte Klassen in TypeScript dienen als Basisklassen, von denen andere Klassen ableiten können. Sie können abstrakte Methoden (Methoden ohne Implementierung) und konkrete Methoden (Methoden mit Implementierung) enthalten. Das Wichtigste daran zu erinnern ist, dass Sie keine Instanz einer abstrakten Klasse direkt erstellen können.

Erstellen von Abstrakten Klassen

Nun schauen wir uns an, wie man eine abstrakte Klasse in TypeScript erstellt. Wir verwenden das Schlüsselwort abstract vor dem class Schlüsselwort. Hier ist eine grundlegende Struktur:

abstract class ClassName {
// Eigenschaften und Methoden hier
}

Abstrakte Methoden

Abstrakte Klassen können abstrakte Methoden haben. Diese sind Methoden, die deklariert, aber in der abstrakten Klasse nicht implementiert sind. Jede Klasse, die diese abstrakte Klasse erweitert, muss eine Implementierung für diese Methoden bereitstellen.

Konkrete Methoden

Abstrakte Klassen können auch konkrete Methoden haben, die sind vollständig implementierte Methoden, die von Kindklassen erben können.

Beispiel 1: Die Abstrakte Klasse Shape

Lassen Sie uns ein einfaches Beispiel erstellen, um zu zeigen, wie abstrakte Klassen funktionieren. Wir erstellen eine abstrakte Shape Klasse mit einer abstrakten Methode calculateArea().

abstract class Shape {
color: string;

constructor(color: string) {
this.color = color;
}

abstract calculateArea(): number;

displayColor(): void {
console.log(`This shape is ${this.color}`);
}
}

In diesem Beispiel:

  • Shape ist unsere abstrakte Klasse.
  • color ist eine Eigenschaft, die alle Formen haben werden.
  • calculateArea() ist eine abstrakte Methode. Beachten Sie, dass sie keinen Körper hat, nur eine Deklaration.
  • displayColor() ist eine konkrete Methode, die alle Formen so verwenden können.

Nun erstellen wir einige spezifische Formen, die unsere Shape Klasse erweitern:

class Circle extends Shape {
radius: number;

constructor(color: string, radius: number) {
super(color);
this.radius = radius;
}

calculateArea(): number {
return Math.PI * this.radius * this.radius;
}
}

class Rectangle extends Shape {
width: number;
height: number;

constructor(color: string, width: number, height: number) {
super(color);
this.width = width;
this.height = height;
}

calculateArea(): number {
return this.width * this.height;
}
}

Jetzt können wir diese Klassen verwenden:

const circle = new Circle("red", 5);
console.log(circle.calculateArea()); // Ausgabe: 78.53981633974483
circle.displayColor(); // Ausgabe: This shape is red

const rectangle = new Rectangle("blue", 4, 6);
console.log(rectangle.calculateArea()); // Ausgabe: 24
rectangle.displayColor(); // Ausgabe: This shape is blue

In diesem Beispiel erweitern sowohl Circle als auch Rectangle die Shape Klasse und bieten ihre eigene Implementierung der calculateArea() Methode. Sie erben auch die displayColor() Methode von der Shape Klasse.

Beispiel 2: Die Abstrakte Klasse Animal

Lassen Sie uns ein weiteres Beispiel erstellen, um unser Verständnis zu festigen. Diesmal erstellen wir eine abstrakte Animal Klasse:

abstract class Animal {
name: string;

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

abstract makeSound(): void;

move(distance: number = 0): void {
console.log(`${this.name} moved ${distance} meters.`);
}
}

class Dog extends Animal {
constructor(name: string) {
super(name);
}

makeSound(): void {
console.log("Woof! Woof!");
}
}

class Cat extends Animal {
constructor(name: string) {
super(name);
}

makeSound(): void {
console.log("Meow!");
}
}

Nutzen wir diese Klassen:

const dog = new Dog("Buddy");
dog.makeSound(); // Ausgabe: Woof! Woof!
dog.move(10); // Ausgabe: Buddy moved 10 meters.

const cat = new Cat("Whiskers");
cat.makeSound(); // Ausgabe: Meow!
cat.move(5); // Ausgabe: Whiskers moved 5 meters.

In diesem Beispiel ist Animal unsere abstrakte Klasse mit einer abstrakten makeSound() Methode und einer konkreten move() Methode. Dog und Cat erweitern Animal und bieten ihre eigene Implementierung der makeSound() Methode.

Warum Abstrakte Klassen verwenden?

Vielleicht fragen Sie sich, "Warum all diese Mühe? Warum nicht einfach reguläre Klassen verwenden?" Nun, abstrakte Klassen sind äußerst nützlich, wenn Sie eine gemeinsame Schnittstelle für eine Gruppe verwandter Klassen definieren möchten. Sie ermöglichen es Ihnen:

  1. Eine gemeinsame Struktur für eine Gruppe verwandter Klassen zu definieren.
  2. Sicherzustellen, dass bestimmte Methoden von Kindklassen implementiert werden.
  3. Einige gemeinsame Funktionalität bereitzustellen, die alle Kindklassen verwenden können.

Denken Sie daran als Erstellung einer Vorlage oder eines Vertrags, den andere Klassen einhalten müssen. Es ist eine Möglichkeit, Konsistenz über verwandte Klassen hinweg zu gewährleisten, während gleichzeitig eine Anpassung dort ermöglicht wird, wo sie benötigt wird.

Methoden in Abstrakten Klassen

Hier ist eine Tabelle, die die Arten von Methoden zusammenfasst, die Sie in abstrakten Klassen haben können:

Methodenart Beschreibung Kann auf abstrakte Klasse aufgerufen werden? Muss von Kindklasse implementiert werden?
Abstrakte Methode Deklariert ohne Implementierung Nein Ja
Konkrete Methode Vollständig implementierte Methode Ja Nein (kann überschrieben werden)

Fazit

Und das war's, Leute! Wir haben eine Reise durch die Welt der abstrakten Klassen in TypeScript unternommen. Von der Verständigung dessen, was sie sind, bis hin zu deren Erstellung und praktischen Beispielen haben Sie nun eine solide Grundlage in dieser leistungsstarken TypeScript-Funktion.

Erinnern Sie sich daran, dass abstrakte Klassen wie die Baupläne für ein Gebäude sind. Sie bieten die Struktur und einige Details, aber es ist an den Klassen, die sie erweitern, die spezifischen Details auszufüllen und sie zum Leben zu erwecken.

Wenn Sie Ihre Programmierreise fortsetzen, werden Sie feststellen, dass abstrakte Klassen äußerst nützliche Werkzeuge in Ihrem TypeScript-Werkzeugkasten sind. Sie helfen Ihnen, sauberere, organisierte und wartbare Code zu schreiben. Also, stürzen Sie sich in die Welt der Abstraktionen und tun Sie es mit Leidenschaft!

Frohes Coden und bis zum nächsten Mal, bleiben Sie neugierig und weiterlernend!

Credits: Image by storyset