Cplusplus-cpp-interfaces
C ++のインターフェイス(抽象クラス)
インターフェイスは、C ++クラスの特定の実装をコミットせずに、そのクラスの動作または機能を記述します。
C ++インターフェースは* abstractクラス*を使用して実装されます。これらの抽象クラスは、実装の詳細を関連データから分離する概念であるデータ抽象化と混同しないでください。
クラスは、その関数の少なくとも1つを pure virtual 関数として宣言することにより抽象化されます。 純粋な仮想関数は、次のように宣言に「= 0」を配置することで指定されます-
class Box {
public:
//pure virtual function
virtual double getVolume() = 0;
private:
double length; //Length of a box
double breadth; //Breadth of a box
double height; //Height of a box
};
抽象クラス(多くの場合ABCと呼ばれる)の目的は、他のクラスが継承できる適切な基本クラスを提供することです。 抽象クラスはオブジェクトのインスタンス化には使用できず、*インターフェース*としてのみ機能します。 抽象クラスのオブジェクトをインスタンス化しようとすると、コンパイルエラーが発生します。
したがって、ABCのサブクラスをインスタンス化する必要がある場合、各仮想関数を実装する必要があります。つまり、ABCによって宣言されたインターフェイスをサポートします。 派生クラスの純粋な仮想関数をオーバーライドしてから、そのクラスのオブジェクトをインスタンス化しようとして失敗すると、コンパイルエラーになります。
オブジェクトのインスタンス化に使用できるクラスは、*具象クラス*と呼ばれます。
抽象クラスの例
親クラスが* getArea()*という関数を実装するために基本クラスへのインターフェースを提供する次の例を考えてください-
#include <iostream>
using namespace std;
//Base class
class Shape {
public:
//pure virtual function providing interface framework.
virtual int getArea() = 0;
void setWidth(int w) {
width = w;
}
void setHeight(int h) {
height = h;
}
protected:
int width;
int height;
};
//Derived classes
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);
//Print the area of the object.
cout << "Total Rectangle area: " << Rect.getArea() << endl;
Tri.setWidth(5);
Tri.setHeight(7);
//Print the area of the object.
cout << "Total Triangle area: " << Tri.getArea() << endl;
return 0;
}
上記のコードをコンパイルして実行すると、次の結果が生成されます-
Total Rectangle area: 35
Total Triangle area: 17
抽象クラスがgetArea()の観点からインターフェースをどのように定義し、他の2つのクラスが同じ機能を実装したが、形状に固有の面積を計算するアルゴリズムが異なることがわかります。
戦略の設計
オブジェクト指向システムは、抽象基本クラスを使用して、すべての外部アプリケーションに適した共通の標準化されたインターフェースを提供します。 次に、その抽象基本クラスからの継承を通じて、同様に動作する派生クラスが形成されます。
外部アプリケーションによって提供される機能(つまり、パブリック関数)は、抽象基本クラスの純粋な仮想関数として提供されます。 これらの純粋な仮想関数の実装は、アプリケーションの特定のタイプに対応する派生クラスで提供されます。
また、このアーキテクチャにより、システムが定義された後でも、新しいアプリケーションをシステムに簡単に追加できます。