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言語