C++ Datenabstraktion
Datenabstraktion bedeutet, der Außenwelt nur die wesentlichen Informationen bereitzustellen und die zugrunde liegenden Implementierungsdetails zu verbergen – das heißt, nur notwendige Informationen zu präsentieren, ohne die Details offenzulegen.
Datenabstraktion ist eine Programmier- (Design-)Technik, die auf der Trennung von Schnittstelle und Implementierung beruht.
Nehmen wir ein Beispiel aus dem wirklichen Leben, etwa einen Fernseher. Sie können ihn ein- und ausschalten, Kanäle wechseln, die Lautstärke anpassen und externe Komponenten (wie Lautsprecher, einen Videorekorder oder einen DVD-Player) hinzufügen, aber Sie kennen seine internen Implementierungsdetails nicht. Mit anderen Worten: Sie wissen nicht, wie er Signale über Kabel empfängt, wie er diese Signale umwandelt und schließlich auf dem Bildschirm anzeigt.
Daher können wir sagen, dass ein Fernseher seine interne Implementierung von seiner externen Schnittstelle trennt. Sie müssen nicht wissen, wie er intern funktioniert; Sie können den Fernseher direkt über seine externen Schnittstellen bedienen, wie etwa den Netzschalter, die Fernbedienung und die Lautstärkeregelung.
Jetzt kommen wir auf den Punkt zurück. Im Hinblick auf die C++-Programmierung machen C++-KlassenDatenabstraktiondies möglich. Sie stellen der Außenwelt eine große Anzahl öffentlicher Methoden zur Manipulation von Objektdaten bereit, was bedeutet, dass die Außenwelt die interne Implementierung der Klasse nicht wirklich kennt.
Zum Beispiel kann Ihr Programmsort()-Funktionen aufrufen, ohne den Algorithmus kennen zu müssen, der in der Funktion zum Sortieren von Daten verwendet wird. Tatsächlich kann die zugrunde liegende Implementierung der Sortierfunktion je nach Bibliotheksversion variieren; solange die Schnittstelle unverändert bleibt, kann der Funktionsaufruf weiterhin normal funktionieren.
In C++ verwenden wirClass, um unsere eigenen abstrakten Datentypen (ADTs) zu definieren. Sie können KlasseniostreamvoncoutObjekte, um Daten auf der Standardausgabe auszugeben, wie unten gezeigt:
Beispiel
Hier müssen Sie nicht verstehen,coutwie Text auf dem Bildschirm des Benutzers angezeigt wird. Sie müssen nur die öffentliche Schnittstelle kennen; die zugrunde liegende Implementierung von cout kann frei geändert werden.
Zugriffskennzeichnungen erzwingen Abstraktion
In C++ verwenden wir Zugriffskennzeichnungen, um die abstrakte Schnittstelle einer Klasse zu definieren. Eine Klasse kann null oder mehr Zugriffskennzeichnungen enthalten:
- Mit der public-Kennzeichnung definierte Member sind für alle Teile des Programms zugänglich. Die Datenabstraktionssicht eines Typs wird durch seine öffentlichen Member definiert.
- Mit der private-Kennzeichnung definierte Member sind für Code, der die Klasse verwendet, nicht zugänglich. Der private Abschnitt verbirgt Implementierungsdetails vor dem Code, der den Typ verwendet.
Es gibt keine Begrenzung, wie oft Zugriffskennzeichnungen auftreten dürfen. Jede Zugriffskennzeichnung legt die Zugriffsebene der unmittelbar darauf folgenden Member-Definitionen fest. Die angegebene Zugriffsebene bleibt in Kraft, bis die nächste Zugriffskennzeichnung angetroffen wird oder bis die schließende rechte geschweifte Klammer des Klassenkörpers erreicht ist.
Vorteile der Datenabstraktion
Datenabstraktion hat zwei wichtige Vorteile:
- Der interne Zustand einer Klasse ist vor Schäden geschützt, die durch unbeabsichtigte Fehler auf Benutzerebene verursacht werden.
- Die Klassenimplementierung kann sich im Laufe der Zeit ändern, um auf sich ändernde Anforderungen zu reagieren oder auf Fehlerberichte zu reagieren, die keine Änderungen am Code auf Benutzerebene erfordern.
Wenn Datenelemente nur im privaten Abschnitt einer Klasse definiert sind, kann der Autor der Klasse die Daten nach Belieben ändern. Wenn sich die Implementierung ändert, muss nur der Klassencode untersucht werden, um zu sehen, welche Auswirkungen die Änderung hat. Wenn die Daten öffentlich sind, kann jede Funktion betroffen sein, die direkt auf Datenelemente der alten Repräsentation zugreift.
Beispiele für Datenabstraktion
In einem C++-Programm kann jede Klasse mit öffentlichen und privaten Membern als Instanz der Datenabstraktion dienen. Siehe folgendes Beispiel:
Beispiel
Wenn der obige Code kompiliert und ausgeführt wird, liefert er die folgenden Ergebnisse:
Total 60
Die obige Klasse addiert Zahlen und gibt die Summe zurück. Die öffentlichen MitgliederaddNumundgetTotalsind die externe Schnittstelle; Benutzer müssen sie kennen, um die Klasse zu verwenden. Die privaten Mitgliedertotalsind Dinge, die Benutzer nicht wissen müssen, die aber notwendig sind, damit die Klasse korrekt funktioniert.
Entwurfsstrategie
Abstraktion trennt Code in Schnittstelle und Implementierung. Daher muss beim Entwerfen von Komponenten die Schnittstelle unabhängig von der Implementierung gehalten werden, sodass die Schnittstelle unverändert bleibt, wenn sich die zugrunde liegende Implementierung ändert.
In diesem Fall wird die Schnittstelle unabhängig davon, welches Programm sie verwendet, nicht beeinflusst; nur die neueste Implementierung muss neu kompiliert werden.
Weitere Erweiterungen