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!
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:
- Eine gemeinsame Struktur für eine Gruppe verwandter Klassen zu definieren.
- Sicherzustellen, dass bestimmte Methoden von Kindklassen implementiert werden.
- 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