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