Datenabstraktion in C++
Datenabstraktion bezieht sich darauf, der Außenwelt nur wesentliche Informationen bereitzustellen und ihre Hintergrunddetails zu verbergen, d. h. die erforderlichen Informationen im Programm darzustellen, ohne die Details zu präsentieren.
Datenabstraktion ist eine Programmier- (und Design-) Technik, die auf der Trennung von Schnittstelle und Implementierung beruht.
Nehmen wir ein reales Beispiel eines Fernsehers, den Sie ein- und ausschalten, den Kanal wechseln, die Lautstärke regeln und externe Komponenten wie Lautsprecher, Videorecorder und DVD-Player hinzufügen können, ABER Sie kennen seine internen Details nicht Das heißt, Sie wissen nicht, wie es Signale über die Luft oder über ein Kabel empfängt, wie es sie übersetzt und schließlich auf dem Bildschirm anzeigt.
Daher können wir sagen, dass ein Fernseher seine interne Implementierung klar von seiner externen Schnittstelle trennt, und Sie können mit seinen Schnittstellen wie dem Einschaltknopf, dem Kanalwechsler und der Lautstärkeregelung spielen, ohne etwas über seine Interna zu wissen.
In C++ bieten Klassen ein hohes Maß an Datenabstraktion . Sie stellen der Außenwelt genügend öffentliche Methoden zur Verfügung, um mit der Funktionalität des Objekts zu spielen und Objektdaten zu manipulieren, d. h. den Zustand, ohne tatsächlich zu wissen, wie die Klasse intern implementiert wurde.
Beispielsweise kann Ihr Programm sort() aufrufen Funktion, ohne zu wissen, welchen Algorithmus die Funktion tatsächlich verwendet, um die gegebenen Werte zu sortieren. Tatsächlich könnte sich die zugrunde liegende Implementierung der Sortierfunktion zwischen Versionen der Bibliothek ändern, und solange die Schnittstelle gleich bleibt, wird Ihr Funktionsaufruf immer noch funktionieren.
In C++ verwenden wir Klassen unsere eigenen abstrakten Datentypen (ADT) zu definieren. Sie können den cout verwenden Objekt der Klasse ostream um Daten wie folgt zur Standardausgabe zu streamen −
Live-Demo#include <iostream> using namespace std; int main() { cout << "Hello C++" <<endl; return 0; }
Hier müssen Sie nicht verstehen, wie cout zeigt den Text auf dem Bildschirm des Benutzers an. Sie müssen nur die öffentliche Schnittstelle kennen und die zugrunde liegende Implementierung von „cout“ kann sich frei ändern.
Zugriffsbezeichnungen erzwingen Abstraktion
In C++ verwenden wir Zugriffslabels, um die abstrakte Schnittstelle zur Klasse zu definieren. Eine Klasse kann null oder mehr Zugriffskennzeichen enthalten −
-
Mitglieder, die mit einem öffentlichen Label definiert sind, sind für alle Teile des Programms zugänglich. Die Datenabstraktionsansicht eines Typs wird durch seine öffentlichen Mitglieder definiert.
-
Mit einer privaten Bezeichnung definierte Member sind für Code, der die Klasse verwendet, nicht zugänglich. Die privaten Abschnitte verbergen die Implementierung vor Code, der den Typ verwendet.
Es gibt keine Beschränkungen, wie oft ein Zugriffsetikett erscheinen darf. Jede Zugriffsbezeichnung gibt die Zugriffsebene der nachfolgenden Mitgliedsdefinitionen an. Die angegebene Zugriffsebene bleibt in Kraft, bis das nächste Zugriffslabel angetroffen oder die schließende rechte Klammer des Klassenkörpers gesehen wird.
Vorteile der Datenabstraktion
Die Datenabstraktion bietet zwei wichtige Vorteile −
-
Interne Klassen sind vor unbeabsichtigten Fehlern auf Benutzerebene geschützt, die den Zustand des Objekts beschädigen könnten.
-
Die Klassenimplementierung kann sich im Laufe der Zeit als Reaktion auf sich ändernde Anforderungen oder Fehlerberichte weiterentwickeln, ohne dass eine Änderung des Codes auf Benutzerebene erforderlich ist.
Indem Datenelemente nur im privaten Abschnitt der Klasse definiert werden, kann der Autor der Klasse Änderungen an den Daten vornehmen. Wenn sich die Implementierung ändert, muss nur der Klassencode untersucht werden, um zu sehen, welche Auswirkungen die Änderung haben kann. Wenn Daten öffentlich sind, kann jede Funktion, die direkt auf die Datenelemente der alten Darstellung zugreift, beschädigt werden.
Beispiel für Datenabstraktion
Jedes C++-Programm, in dem Sie eine Klasse mit öffentlichen und privaten Membern implementieren, ist ein Beispiel für Datenabstraktion. Betrachten Sie das folgende Beispiel −
Live-Demo#include <iostream> using namespace std; class Adder { public: // constructor Adder(int i = 0) { total = i; } // interface to outside world void addNum(int number) { total += number; } // interface to outside world int getTotal() { return total; }; private: // hidden data from outside world int total; }; int main() { Adder a; a.addNum(10); a.addNum(20); a.addNum(30); cout << "Total " << a.getTotal() <<endl; return 0; }
Wenn der obige Code kompiliert und ausgeführt wird, erzeugt er das folgende Ergebnis −
Total 60
Obige Klasse addiert Zahlen und gibt die Summe zurück. Die öffentlichen Mitglieder - addNum und getTotal sind die Schnittstellen zur Außenwelt und ein Benutzer muss sie kennen, um die Klasse zu verwenden. Das private Mitglied gesamt ist etwas, worüber der Benutzer nichts wissen muss, aber für den ordnungsgemäßen Betrieb der Klasse erforderlich ist.
Strategie entwerfen
Abstraktion trennt Code in Schnittstelle und Implementierung. Während Sie also Ihre Komponente entwerfen, müssen Sie die Schnittstelle unabhängig von der Implementierung halten, damit die Schnittstelle intakt bleibt, wenn Sie die zugrunde liegende Implementierung ändern.
In diesem Fall wären alle Programme, die diese Schnittstellen verwenden, nicht betroffen und müssten nur mit der neuesten Implementierung neu kompiliert werden.
C Sprache