C++ Schnittstelle (Abstrakte Klasse)

Eine Schnittstelle beschreibt das Verhalten und die Funktionalität einer Klasse, ohne die spezifische Implementierung der Klasse zu erfordern.

C++-Schnittstellen werden mithilfe vonAbstrakte Klasseabstrakten Klassen implementiert. Abstrakte Klassen und Datenabstraktion sind nicht zu verwechseln; Datenabstraktion ist ein Konzept, das Implementierungsdetails von zugehörigen Daten trennt.

Wenn mindestens eine Funktion in einer Klasse als rein virtuelle Funktion deklariert ist, dann ist die Klasse eine abstrakte Klasse. Eine rein virtuelle Funktion wird durch die Verwendung von "= 0" in ihrer Deklaration angegeben, wie unten gezeigt:

class Box { public: // Rein virtuelle Funktion virtual double getVolume() = 0; private: double length; // Länge double breadth; // Breite double height; // Höhe };

EntwurfAbstrakte KlasseDer Zweck einer abstrakten Klasse (oft ABC genannt) besteht darin, eine geeignete Basisklasse bereitzustellen, von der andere Klassen erben können. Abstrakte Klassen können nicht zum Instanziieren von Objekten verwendet werden; sie können nur alsSchnittstelleSchnittstellen. Der Versuch, ein Objekt einer abstrakten Klasse zu instanziieren, verursacht einen Kompilierungsfehler.

Daher muss eine Unterklasse einer ABC, wenn sie instanziiert werden soll, jede rein virtuelle Funktion implementieren. Das bedeutet auch, dass C++ die Verwendung von ABCs zum Deklarieren von Schnittstellen unterstützt. Wenn Sie versuchen, ein Objekt einer solchen Klasse zu instanziieren, ohne die rein virtuellen Funktionen in der abgeleiteten Klasse zu überschreiben, tritt ein Kompilierungsfehler auf.

Eine Klasse, die zum Instanziieren von Objekten verwendet werden kann, heißtkonkrete Klasse。

Eine Instanz einer abstrakten Klasse

Siehe das folgende Beispiel. Die Basisklasse Shape stellt eine SchnittstellegetArea(), die jeweils in den beiden abgeleiteten Klassen Rectangle und Triangle alsgetArea() implementiert wird, bereit:

Beispiel

#include <iostream> using namespace std; // Basisklasse class Shape { public: // Rein virtuelle Funktionen, die das Schnittstellen-Framework bereitstellen virtual int getArea() = 0; void setWidth(int w) { width = w; } void setHeight(int h) { height = h; } protected: int width; int height; }; // Abgeleitete Klasse class Rectangle: public Shape { public: int getArea() { return (width * height); } }; class Triangle: public Shape { public: int getArea() { return (width * height)/2; } }; int main(void) { Rectangle Rect; Triangle Tri; Rect.setWidth(5); Rect.setHeight(7); // Ausgabe der Fläche des Objekts cout << "Gesamtfläche Rechteck: " << Rect.getArea() << endl; Tri.setWidth(5); Tri.setHeight(7); // Die Fläche des Objekts ausgeben cout << "Gesamtfläche Dreieck: " << Tri.getArea() << endl; return 0; }

Wenn der obige Code kompiliert und ausgeführt wird, liefert er die folgenden Ergebnisse:

Total Rectangle area: 35
Total Triangle area: 17

Aus dem obigen Beispiel können wir sehen, wie eine abstrakte Klasse eine Schnittstelle getArea() definiert und wie zwei abgeleitete Klassen dieselbe Funktion durch unterschiedliche Algorithmen zur Flächenberechnung implementieren.

Entwurfsstrategie

Ein objektorientiertes System kann eine abstrakte Basisklasse verwenden, um eine geeignete, gemeinsame, standardisierte Schnittstelle für alle externen Anwendungen bereitzustellen. Durch Vererbung von der abstrakten Basisklasse erben abgeleitete Klassen dann alle ähnlichen Operationen.

Die von externen Anwendungen bereitgestellten Funktionen (d. h. öffentliche Funktionen) existieren als rein virtuelle Funktionen in der abstrakten Basisklasse. Diese rein virtuellen Funktionen werden in den entsprechenden abgeleiteten Klassen implementiert.

Diese Architektur erleichtert auch das Hinzufügen neuer Anwendungen zum System, selbst nachdem das System definiert wurde.

Weitere Erweiterungen