C++インターフェース(抽象クラス)
インターフェイスは、クラスの特定の実装を完了する必要なく、クラスの動作と機能を記述します。
C++ インターフェイスは、抽象クラス を使用して実装されます。抽象クラスとデータ抽象化は、実装の詳細を関連データから分離する概念です。
クラス内の少なくとも 1 つの関数が純粋仮想関数として宣言されている場合、そのクラスは抽象クラスです。純粋仮想関数は、以下に示すように、宣言で「= 0」を使用して指定します。
class Box { public: // 纯虚函数 virtual double getVolume() = 0; private: double length; // 长度 double breadth; // 宽度 double height; // 高度 };
抽象クラス (ABC と呼ばれることが多い) を設計する目的は、他のクラスに適切な基本クラスを提供することです。抽象クラスはオブジェクトのインスタンス化には使用できず、インターフェースとしてのみ使用できます。抽象クラスのオブジェクトをインスタンス化しようとすると、コンパイル エラーが発生します。
したがって、ABC のサブクラスをインスタンス化する必要がある場合は、各仮想関数を実装する必要があります。これは、C++ がインターフェイスを宣言するための ABC の使用をサポートしていることも意味します。純粋仮想関数が派生クラスでオーバーロードされていない場合、このクラスのオブジェクトをインスタンス化しようとするとコンパイル エラーが発生します。
オブジェクトのインスタンス化に使用できるクラスは、具象クラスと呼ばれます。
抽象クラスの例
基本クラス Shape は、2 つの派生クラス Rectangle と Triangle にそれぞれ実装されるインターフェースgetArea()を提供しますgetArea():
#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; }
コードがコンパイルされて実行されると、次の結果が生成されます:
Total Rectangle area: 35 Total Triangle area: 17
上の例から、抽象クラスがインターフェイス getArea() を定義する方法と、これを実装するために 2 つの派生クラスが異なるアルゴリズムを通じて面積を計算する方法がわかります。同じ機能です。
設計戦略
オブジェクト指向システムは、抽象基本クラスを使用して、すべての外部アプリケーションに適切で共通の標準化されたインターフェイスを提供する場合があります。次に、派生クラスは、抽象基本クラスを継承することによって、同様の操作をすべて継承します。
外部アプリケーションによって提供される関数 (つまり、パブリック関数) は、抽象基本クラス内の純粋な仮想関数の形式で存在します。これらの純粋仮想関数は、対応する派生クラスに実装されます。
このアーキテクチャにより、システムが定義された後でも、新しいアプリケーションをシステムに簡単に追加できます。