C++ インターフェース(抽象クラス)
インターフェースは、クラスの動作と機能を記述するものであり、クラスの特定の実装を完了する必要はありません。
C++ インターフェースは抽象クラスを使用して実装されます。抽象クラスとデータ抽象は混同されるべきではありません。データ抽象は、実装の詳細を関連データから分離する概念です。
クラス内の少なくとも1つの関数が純粋仮想関数として宣言されている場合、そのクラスは抽象クラスです。純粋仮想関数は、宣言内で「= 0」を使用して指定されます。次のようになります:
設計抽象クラス(通常ABCと呼ばれる)の目的は、他のクラスに継承可能な適切な基底クラスを提供することです。抽象クラスはオブジェクトのインスタンス化には使用できず、それはインターフェースとしてのみ使用できます。抽象クラスのオブジェクトをインスタンス化しようとすると、コンパイルエラーが発生します。
したがって、ABCのサブクラスをインスタンス化する必要がある場合、すべての純粋仮想関数を実装する必要があります。これは、C++がABCを使用したインターフェースの宣言をサポートしていることも意味します。派生クラスで純粋仮想関数をオーバーライドせずにそのクラスのオブジェクトをインスタンス化しようとすると、コンパイルエラーが発生します。
オブジェクトのインスタンス化に使用できるクラスは具体クラスと呼ばれます。
抽象クラスのインスタンス
次の例を見てください。基底クラスShapeはインターフェースを提供しgetArea()、2つの派生クラスRectangleとTriangleでそれぞれ実装していますgetArea():
例
上記のコードをコンパイルして実行すると、次の結果が生成されます:
Total Rectangle area: 35 Total Triangle area: 17
上記の例から、抽象クラスがインターフェースgetArea()をどのように定義するか、2つの派生クラスが異なる面積計算アルゴリズムを通じてこの同じ関数をどのように実装するかがわかります。
設計戦略
オブジェクト指向システムは、抽象基底クラスを使用して、すべての外部アプリケーションに適切で、汎用的で、標準化されたインターフェースを提供する場合があります。その後、派生クラスは抽象基底クラスを継承することで、すべての類似した操作を継承します。
外部アプリケーションに提供される機能(つまりパブリック関数)は、抽象基底クラスでは純粋仮想関数の形で存在します。これらの純粋仮想関数は、対応する派生クラスで実装されます。
また、このアーキテクチャにより、システムが定義された後でも、新しいアプリケーションをシステムに簡単に追加できます。
その他の拡張