Ich habe Stroustrups "Die C ++ Programmiersprache" gelesen und erwähnt sehr oft "Abstraktionen":
Viele der flexibelsten, effizientesten und nützlichsten Abstraktionen beinhalten die Parametrisierung von Typen (Klassen) und Algorithmen (Funktionen) mit anderen Typen und Algorithmen
und
C ++ ist eine Sprache für die Entwicklung und Verwendung eleganter und effizienter Abstraktionen.
Hängt das in irgendeiner Weise mit abstrakten Klassen in C ++ zusammen? Oder mit Polymorphie, Vererbung oder Templates?
Könnte jemand bitte ein Beispiel geben?
In der generischen Programmierung haben Abstraktionen eine genaue Bedeutung und werden "Konzepte" genannt. Ein Konzept ist wie folgt definiert :
Ein Konzept besteht aus einer Reihe von Anforderungen, die aus gültigen Ausdrücken, zugehörigen Typen, Invarianten und Komplexitätsgarantien bestehen. Ein Typ, der die Anforderungen erfüllt, soll das Konzept modellieren. Ein Konzept kann die Anforderungen eines anderen Konzepts erweitern, das als Verfeinerung bezeichnet wird.
Die Implementierung eines Konzepts in echten Code kann auf verschiedene Arten erfolgen. Der klassische OOP-Ansatz besteht darin, eine abstrakte Basisklasse zu schreiben, die die gültigen Ausdrücke und zugehörigen Typen bereitstellt. Die konkret abgeleiteten Klassen liefern dann die Invarianten und die Komplexitätsgarantien. Bei Vorlagen sind die gültigen Ausdrücke impliziter und werden erst nach der Instanziierung überprüft. Template-Implementierungskonzepte sind eine Form von Enttippung : wenn es aussieht wie eine Ente, Quacksalber wie eine Ente, ....
Der C ++ 0x-Entwicklungsprozess hat sich sehr viel Mühe gegeben Konzepte direkt in Code umsetzbar machen, aber nicht in C ++ integriert 11 Standard . Allerdings ein Konzepte Lite Version wird wahrscheinlich in den nächsten C ++ 14 Standard erscheinen.
Abstraktion ( n ) - die Qualität des Umgangs mit Ideen anstelle von Ereignissen
- Quelle: Oxford English Dictionary
Stroustrup bezieht sich nicht auf abstrakte Klassen oder andere spezifische Ideen in der Programmierung. Vielmehr bezieht er sich auf das Wort Abstraktion selbst.
Abstraktionen sind mentale Helfer. Sie helfen uns, eher in "Theorie" als in direkter Anwendung zu denken. Mathematik ist die Kunst der Abstraktion. Programmieren ist die Kunst der angewandten Abstraktionen.
Abstraktionen helfen uns, mentale Modelle wie Hierarchien zu bilden, die uns helfen, über Dinge nachzudenken. Polymorphismus ist aufgrund von Abstraktionen möglich. Schauen wir uns ein Beispiel an.
Ich habe einen Oleksiy Dobrodum. Ich bezeichne es als Oleksiy Dobrodum, ich behandle es wie ein Oleksiy Dobrodum, alles was es jemals geben wird, ist ein Oleksiy Dobrodum. Alles, was ich mit diesem Oleksiy Dobrodum mache, ist speziell dafür. Wir sind jetzt auf der ersten Abstraktionsebene oder am spezifischsten, wenn wir mit diesem Oleksiy Dobrodum arbeiten.
Kürzlich habe ich eine Zach Latta erworben, also habe ich jetzt einen Oleksiy Dobrodum und einen Zach Latta.
Ich könnte sie sowohl einzeln als auch als Oleksiy Dobrodum und als Zach Latta bezeichnen, aber das würde schnell überflüssig werden und sich als nicht flexibel erweisen. Stattdessen können wir einfach Oleksiy Dobrodum und Zach Latta zusammenfassen und sie Menschen nennen. Wir haben jetzt Abstraktionslevel 2 erreicht. Anstatt mit jeder Person einzeln umzugehen, können wir sie als Menschen bezeichnen. Auf diese Weise haben wir die "Implementierung" oder die spezifischen Details jeder Person abstrahiert und haben begonnen, uns auf die Ideen zu konzentrieren, daher denken wir jetzt abstrakt.
Natürlich können wir das weiter abstrahieren, aber hoffentlich fangen Sie an, die Idee hinter Abstraktionen zu verstehen. Der Schlüssel dazu ist, dass eine Abstraktion die Details (oder die Implementierung) versteckt . Indem wir die Details in unserer menschlichen Abstraktion verbergen, erlauben wir uns, in Allgemeinheiten zu sprechen. Wir werden kurz darüber sprechen, wie dies beim Programmieren im nächsten Abschnitt zutrifft.
Nachdem wir nun kurz angesprochen haben, was eine Abstraktion ist, wenden wir sie an. Polymorphismus ist aufgrund von Abstraktionen möglich. Befolgen Sie das Modell des vorherigen Beispiels, sagen wir, dass wir die folgenden zwei Klassen haben:
%Vor%Wenn ich mit einer Instanz von %code% interagieren möchte, muss ich mich speziell auf sie beziehen. Dasselbe gilt für %code% Instanzen.
%Vor%Wenn ich eine abstrakte Klasse namens %code% erstelle und beide %code% und %code% davon erben, kann ich die Implementierung beider Klassen abstrahieren und einfach auf beide Instanzen verweisen von ihnen als %code% .
%Vor%Unser Klassendiagramm sieht jetzt wie folgt aus:
Ich könnte über die Implementierung für immer streiten, aber lassen Sie uns zu unseren wichtigsten Imbissbuden gehen.
Ja, es hängt mit den abstrakten Klassen in C ++ zusammen, und es ist nicht auf diesen Kontext beschränkt, er erklärte generisch, dass C ++ die Abstraktion vollständig unterstützt.
Beispiel: In C ++ können wir die Klassentypen oder Funktionsaufrufe in anderen Typen verwenden. Zum Beispiel kann ein Funktionsaufruf einen Klassentyp / eine Funktion als Parameter haben, sowohl die Funktion als auch a class verweist auf eine Form abstraction- (hier bezieht sich Abstraktion auf das Ausblenden der Definition der Funktion oder einer Klasse vom Benutzer)