C++インタフェース(抽象クラス)

1999 ワード

インタフェースは、クラスの特定の実装を完了する必要がなく、クラスの動作と機能を記述します.
C++インタフェースは抽象クラスを用いて実現され、抽象クラスとデータ抽象は互いに混同されず、データ抽象は実現の詳細と関連するデータを分離する概念である.
クラスの少なくとも1つの関数が純虚関数として宣言されている場合、このクラスは抽象クラスです.次のように、宣言に「=0」を使用して、ダミー関数を指定します.
class Box
{
   public:
      //     
      virtual double getVolume() = 0;
   private:
      double length;      //   
      double breadth;     //   
      double height;      //   
};

抽象クラス(通常ABCと呼ばれる)を設計する目的は、他のクラスに継承可能な適切なベースクラスを提供することである.抽象クラスはオブジェクトをインスタンス化するために使用できません.インタフェースとしてのみ使用できます.抽象クラスのオブジェクトをインスタンス化しようとすると、コンパイルエラーが発生します.
したがって、ABCのサブクラスをインスタンス化する必要がある場合、各虚関数を実装する必要があります.これは、C++がABC宣言インタフェースの使用をサポートすることを意味します.派生クラスに純虚関数を再ロードしない場合は、クラスのオブジェクトをインスタンス化しようとすると、コンパイルエラーが発生します.
オブジェクトをインスタンス化するために使用できるクラスを特定のクラスと呼びます.
抽象クラスのインスタンス
次の例では、ベースクラスAreaは、2つの派生クラスrectangleとtriangleでそれぞれgetArea()を実装するインタフェースgetArea()を提供します.
/*  (   )*/
#include<iostream>
using namespace std;

class Area
{
	public:
		//             
		virtual int getarea()=0;
		void setwidth(int wid)
		{
			width=wid;
		}
		void setheight(int hei)
		{
			height=hei;
		}
	protected://     ,    private
		int width;
		int height;
};

class rectangle:public Area
{
	public:
		int getarea()
		{
			return width*height;
		}
};

class triangle:public Area
{
	public:
		int getarea()
		{
			return (width*height)/2;
		}
};

int main()
{
	rectangle rect;
	triangle tri;

	//    
	rect.setwidth(10);
	rect.setheight(10);
	//    
	cout<<"rectangle area is:"<<rect.getarea()<<endl;

	tri.setwidth(5);
	tri.setheight(10);
	cout<<"triangle area is:"<<tri.getarea()<<endl;

	return 0;
}

せっけいせんりゃく
オブジェクト向けのシステムでは、抽象ベースクラスを使用して、すべての外部アプリケーションに適切で汎用的で標準化されたインタフェースを提供することがあります.そして,派生クラスは抽象ベースクラスを継承することによって,類似したすべての操作を継承する.
外部アプリケーションが提供する機能(すなわち公有関数)は、抽象ベースクラスに純粋な虚関数として存在します.これらの純虚関数は対応する派生クラスで実現される.
このアーキテクチャは、システムが定義された後でも、新しいアプリケーションを容易にシステムに追加することができる.