C++ のインターフェイス (抽象クラス)
インターフェイスは、そのクラスの特定の実装にコミットすることなく、C++ クラスの動作または機能を記述します。
C++ インターフェイスは、抽象クラスを使用して実装されています また、これらの抽象クラスを、実装の詳細を関連データから分離しておくという概念であるデータ抽象化と混同しないでください。
クラスは、その関数の少なくとも 1 つを 純粋仮想 として宣言することによって抽象化されます 関数。純粋仮想関数は、次のように宣言に「=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 つのクラスが同じ関数を実装した方法を確認できますが、形状に固有の面積を計算するアルゴリズムは異なります。
戦略の設計
オブジェクト指向システムは、抽象基本クラスを使用して、すべての外部アプリケーションに適した共通の標準化されたインターフェイスを提供する場合があります。次に、その抽象基本クラスからの継承を通じて、同様に動作する派生クラスが形成されます。
外部アプリケーションによって提供される機能 (つまり、パブリック関数) は、抽象基本クラスの純粋な仮想関数として提供されます。これらの純粋仮想関数の実装は、アプリケーションの特定のタイプに対応する派生クラスで提供されます。
また、このアーキテクチャにより、システムが定義された後でも、新しいアプリケーションをシステムに簡単に追加できます。
C言語