Ein Leitfaden für Anfänger zur Abstraktion in der objektorientierten Programmierung
Wenn Sie einen Burrito essen, singt jeder Ihrer Geschmacksrezeptoren vor Freude. Jeder Biss bringt eine Kombination verschiedener Geschmacksarten mit sich, wie salzig, süß, würzig und umami. Jeder Bissen danach schmeckt etwas anders, da eine neue Sammlung von Zutaten ihre Aromen miteinander verbindet.
Sie haben vielleicht die Zutaten aus dem Menü gelesen, wissen aber nicht genau, wie die Salsa hergestellt wird. Das Gewürz, das sie für ihr Gemüse verwenden, könnte eine geheime Mischung sein. Sie müssen jedoch nicht jede genaue Zutat kennen. Es ist genug zu wissen, dass es köstlich ist.
Die Zutaten, die Sie kennen, wie weißer Reis, sind Beton. Die anderen Elemente sind abstrakt. Sie wissen, dass es Salsa ist, aber welche? Oder wenn Ihnen jemand aus dem Nichts einen Burrito gibt, ist der gesamte Burrito abstrakt.
Abstraktion in der Zusammenfassung
Abstraktion ist neben Vererbung ein wichtiges Konzept in der objektorientierten Programmierung. Die Theorie ist, dass jedes Objekt einfache und vorhersehbare Ergebnisse liefern sollte. Objekte sollten auch nur das teilen, was geteilt werden muss.
Durch die Abstraktion werden Code und Daten bei Bedarf ausgeblendet
Sie können sich einen Burrito als Objekt vorstellen. Im Burrito befinden sich mehrere andere Gegenstände wie Bohnen, Reis, Käse und scharfe Soße. Die Bohnen können gewürzt worden sein. Der Käse könnte eine Mischung sein. Und die scharfe Sauce könnte eine Kombination aus in Essig gereiften Paprikaschoten sein.
Sie müssen nicht wissen, wie alle Zutaten in einem Burrito hergestellt wurden. Und im Fall von Hot Dogs möchten Sie es wahrscheinlich nicht wissen. Alles was zählt ist, dass es beim Essen nicht auseinander fällt und dass es super lecker ist.
Die Abstraktion ist eng mit der Einkapselung verbunden
Das Gleiche gilt für das Programmieren von Objekten. Wenn Sie ein Objekt instanziieren (aus einer Klasse erstellen), bestellen Sie einen Burrito an der Theke des Imbisswagens. Sie haben Zugriff auf einige Daten, aber nicht auf alle. Sie müssen nicht wissen, wie das Objekt funktioniert, solange die Funktionen die richtigen Daten zurückgeben. Hier ist ein Burrito in JavaScript / Typescript:
class CheeseBlend {
private _ingredients = ["Colby Jack", "Cheddar", "Manchego"];
get ingredients() {
return "melted cheese";
}
}
class SecretSalsa {
private _ingredients = ["onions", "tomatoes", "cilantro", "Guatemalan Insanity Peppers"];
get ingredients() {
return "it's a secret";
}
}
class Burrito {
private _beans = "beans";
private _rice = "rice";
private _cheese: CheeseBlend = new CheeseBlend();
private _salsa: SecretSalsa = new SecretSalsa();
get cheese() {
return this._cheese.ingredients;
}
get salsa() {
return this._salsa.ingredients;
}
}
let burro = new Burrito();
console.log(burro.cheese);
console.log(burro.salsa);
Sie können mit diesem Code in der TypeScript-Sandbox spielen .
Im obigen Beispiel werden die Salsa- und Käsezutaten abstrahiert. Erstens sind sie eingekapselt, um die speziellen Zutaten zu verbergen. Dann werden Getter hinzugefügt, um auf die Zutaten zuzugreifen. Aber die Zutaten geben nur eine abstrakte Darstellung dessen zurück, was sie wirklich sind.
Abstraktion im Beton
Abstraktion ist jedoch mehr als ein Konzept. Klassen können auch abstrakt sein. Das bedeutet, dass sie andere Klassen definieren können. Aber sie können nicht selbst instanziiert werden.
Warum Klassen manchmal abstrakt sein sollten
Stellen Sie sich vor, Sie gehen in ein Restaurant und setzen sich. Der Kellner gibt Ihnen ein Menü. Sie öffnen es und stellen fest, dass es nur einen Gegenstand gibt: Essen.
Das ist ziemlich abstrakt. Würden Sie es bestellen? Würden Sie es essen? Das würdest du wahrscheinlich nicht. Etwas zu sagen ist nicht genug. Es muss in etwas Konkreteres zerfallen.
Was ist mit Pasta? Nun, das ist eine spezifischere Art von Essen. Und wir wissen, dass es wahrscheinlich Nudeln und Sauce hat. Aber es gibt viele verschiedene Arten von Nudeln, also ist es immer noch abstrakt.
Was ist abstrakt und was ist konkret?
Fettuccine Alfredo ist ein konkretes Beispiel für Essen und Pasta. Gleiches gilt für Klassen. Nicht jede Klasse sollte instanziiert werden. Einige Klassen sollten nur die Struktur anderer Klassen definieren.
Hier ist ein Beispiel mit einer abstrakten Food- Klasse und einer untergeordneten MacadamiaNuts- Klasse:
abstract class Food {
constructor(public name: String) {}
abstract totalCalories(): number;
abstract description(): string;
abstract flavor(): string;
}
class MacadamiaNuts extends Food {
constructor() {
super("One Cup of Macadamia Nuts");
}
totalCalories() {
return 962;
}
description() {
return "A nut from Hawaii.";
}
flavor() {
return "rich, buttery, and nutty";
}
}
let nuts = new MacadamiaNuts();
console.log(nuts.name)
console.log(nuts.description())
Abstrakte Klassen sagen anderen Klassen, wie sie sich verhalten sollen. Wenn Sie im obigen Beispiel eine Lebensmittelklasse sein möchten, müssen Sie über Funktionen verfügen, die den Zugriff auf Ihren Namen, Ihren Geschmack, Ihre Beschreibung und Ihre Kalorien ermöglichen.
Beachten Sie, dass die MacadamiaNuts Klasse erweitert Nahrung. Das heißt, dass MacadamiaNuts sich bereit erklärt, die Regeln für Lebensmittel zu befolgen. Beachten Sie auch, dass der Konstruktor super aufruft. Dieser Befehl instanziiert die übergeordnete Klasse, bevor der Konstruktor MacadamiaNuts instanziiert.
Wenn Sie das Programmieren lernen, können Sie mit diesen Programmierspielen mehr Spaß haben .
Abstraktionspraxis
- Besuchen Sie den obigen Link und verwenden Sie die Sandbox, um eine abstrakte Klasse namens Soup zu erstellen .
- Erstellen Sie ein konkretes Kind der Suppenklasse namens Cereal .
- Verwenden Sie console.log , um Ihren Code zu testen. Was passiert, wenn Ihrer Getreideklasse eine der in Suppe definierten Funktionen fehlt?
Aber was ist der Sinn einer Klasse, die Sie nicht instanziieren können?
Auf den ersten Blick scheinen abstrakte Klassen unnötig zu sein. Schließlich können Sie sie nicht verwenden, um ein Objekt zu erstellen. Und es ist nicht so, dass sie ihre Funktionen weitergeben. Funktionen müssen in jeder Kinderklasse neu geschrieben werden.
Es gibt zwei Hauptgründe, warum Sie abstrakte Klassen benötigen. Sie halten Ihren Code konsistent und stellen sicher, dass auch andere Entwickler konsistenten Code schreiben. Sie werden nicht immer alleine arbeiten. Das gesamte Team muss die gleichen Regeln befolgen. Weitere Informationen finden Sie in der TypeScript-Dokumentation zu abstrakten Klassen .