Latest web development tutorials

C ++ Schnittstelle (abstrakte Klasse)

Es beschreibt das Verhalten der Schnittstelle und Funktionsklasse, ohne die Notwendigkeit, eine besondere Implementierungsklasse zu vervollständigen.

C ++ Schnittstelle implementiert ist eineabstrakte Klasse, abstrakte Klasse und nicht mit Datenabstraktion, Datenabstraktion zu verwechseln ist ein Konzept der Implementierungsdetails im Zusammenhang mit getrennten Daten.

Wenn mindestens eine Funktionsklasse als reine virtuelle Funktion deklariert wird, dann ist diese Klasse eine abstrakte Klasse. Rein virtuelle Funktion, indem sie die "= 0" in der Anweisung angegeben wird, wie folgt:

class Box
{
   public:
      // 纯虚函数
      virtual double getVolume() = 0;
   private:
      double length;      // 长度
      double breadth;     // 宽度
      double height;      // 高度
};

Entwerfen Sieeine abstrakte Klasse (gemeinhin als ABC) Der Zweck der andere eine Klasse zu geben ist , kann die entsprechende Basisklasse erben.Eine abstrakte Klasse kann nicht ein Objekt instanziiert verwendet werden, kann es nur alsSchnittstelle verwendet werden.Wenn Sie versuchen, ein Objekt von einer abstrakten Klasse instanziiert, wird es in einem Übersetzungsfehler zur Folge haben.

Wenn also die ABC eine Unterklasse instanziiert wird, müssen Sie jede virtuelle Funktion implementieren, es bedeutet auch, dass C ++ die Anweisung Schnittstelle Verwendung von ABC unterstützt. Wenn es keine Überlastung rein virtuelle Funktion in einer abgeleiteten Klasse ist, versuchen, ein Objekt dieser Klasse instanziiert wird einen Compiler-Fehler verursachen.

Klasse kann verwendet werden , um ein Objekt zu instanziieren ist einekonkrete Klasse genannt.

Instanz einer abstrakten Klasse

Betrachten Sie die folgenden Beispiele, stellt die Basisklasse Form eine SchnittstellegetArea (), zwei abgeleiteten Klassen Rechteck und Dreieck wurden in der getArearealisiert():

#include <iostream>
 
using namespace std;
 
// 基类
class Shape 
{
public:
   // 提供接口框架的纯虚函数
   virtual int getArea() = 0;
   void setWidth(int w)
   {
      width = w;
   }
   void setHeight(int h)
   {
      height = h;
   }
protected:
   int width;
   int height;
};
 
// 派生类
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);
   // 输出对象的面积
   cout << "Total Rectangle area: " << Rect.getArea() << endl;

   Tri.setWidth(5);
   Tri.setHeight(7);
   // 输出对象的面积
   cout << "Total Triangle area: " << Tri.getArea() << endl; 

   return 0;
}

Wenn der obige Code kompiliert und ausgeführt wird, erzeugt es die folgenden Ergebnisse:

Total Rectangle area: 35
Total Triangle area: 17

Aus den obigen Beispielen können wir sehen, wie eine abstrakte Klasse ist eine Schnittstelle getArea (), zwei abgeleiteten Klassen zu definieren, wie die Fläche eines anderen Algorithmus zur Berechnung die gleiche Funktion zu erreichen.

Design Strategy

Objektorientierte Systeme können eine abstrakte Basisklasse verwenden, bietet eine geeignete, generische, standardisierte Schnittstelle für alle externen Anwendungen. Dann wird die abgeleitete Klasse von von einer abstrakten Basisklasse erben, setzen alle diese Vorgänge vererbt werden.

Funktion (dh öffentliche Funktion) externe Anwendungen in Form einer abstrakten Basisklasse zur Verfügung gestellt rein virtuelle Funktionen existieren. Diese reinen virtuellen Funktionen sind in der entsprechenden abgeleiteten Klasse implementiert.

Diese Architektur ermöglicht auch neue Anwendungen können leicht zu dem System hinzugefügt werden, selbst nachdem das System noch so definiert werden.