第 10 章: インタフェースクラス

インタフェースクラス

インタフェースは抽象クラスとも呼ばれている.

インタフェースは:

1. メンバ変数を持たず
2. メンバ関数だけで構成される (宣言だけ, 定義がない)
3. インタフェースクラスをインスタンス化することもできない

注意:

インタフェースクラスは, 継承して使うこと, そして, 定義のないメンバ関数たちは, オーバーライドで使用する.

C++ での実現方法

C++ ではインタフェースクラスを実現する方法:

// インタフェースクラスの定義
class IPen{
public:
  // 線を描く
  virtual void DrawLine(int sx, int xy, int ex, int ey) = 0;
}

注意:

最後に [ = 0] が付いており, これを付けると, そのメンバ関数の定義を省略できる. 定義がないために, このクラスをインスタンス化することができない.

IPen インタフェースクラスを使ってみる

インタフェース (純粋仮想関数を含んでいるクラス) はインスタンス化ができない. そのため, 必ず継承を行い, そのサブクラス側の方をインスタンス化することになる.

pen.h

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// pen.h

// CColorPen クラスで使う線の色

#define BLACK (0)
#define RED (1)
#define BLUE (2)
#define GREEN (3)

// インタフェースクラスの定義
class IPen{
 public:
  // 線を描く
  virtual void DrawLine(int sx, int sy, int ex, int ey) = 0;
};

// 黒いペンのクラス (インタフェースクラスは IPen)
class CPen : public IPen{
 public:
  // 線を描く
  void DrawLine(int sx, int sy, int ex, int ey);
};

// 色ペンのクラス (インタフェースクラスは IPen)
class CColorPen : public IPen{
 private:
  int m_color; // 線の色
  
 public:
  CColorPen(); // コンストラクタ
  void DrawLine(int sx, int sy, int ex, int ey); // 線を描く
  void SetColor(int color); // 線の色を設定する
};

pen.cpp

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
// pen.cpp
#include "pen.h"

// 黒い線を描く
void CPen::DrawLine(int sx, int sy, int ex, int ey){
  // 黒い線を描く
}

// CColorPen クラスのコンストラクタ
CColorPen::CColorPen(){
  m_color = RED; // 赤いペンを初期カラーとする
}

// 現在設定されている色で線を描く
void CColorPen::DrawLine(int sx, int sy, int ex, int ey){
  // m_color を参照して, その色で線を描く
}

// 線の色を設定する
void CColorPen::SetColor(int color){
  m_color = color;
}

main.cpp

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
// main.cpp
#include "pen.h"

int main(){
  CPen pen;
  CColorPen color_pen;

  pen.DrawLine(10, 10, 100, 100); // 黒い線を描く

  color_pen.SetColor(BLUE); // 青色を設定
  color_pen.DrawLine(20, 20, 200, 200); // 青い線を描く

  return 0;
}

GNUmakefile

.SUFFIXES: .o .cpp
.cpp.o:
	$(CC) -c $(CFLAGS) $<

PROG = main
CC = g++
CFLAGS = -g -Wall
SRC = pen.cpp main.cpp
OBJ = pen.o main.o

hist: $(OBJ)
	$(CC) $(CFLAGS) -o $(PROG) $(OBJ)

.PHONY: clean
clean:
	$(RM) $(PROG) $(OBJ) *~ a.out

main.o: pen.h main.cpp
pen.o: pen.h pen.cpp

上記プログラムの実行結果は:

[wtopia interface]$ make
g++ -c -g -Wall pen.cpp
g++ -c -g -Wall main.cpp
g++ -g -Wall -o main pen.o main.o

注意:

IPen ipen; とすると, コンパイルが通らない.

仮想デストラクタ