オブジェクト指向言語論5

オブジェクト指向言語論
第五回
知能情報学部
新田直也
オブジェクト指向の歴史

実は起源は明らかではない.



チューリング賞:



Simula67: クリステン・ニガード, オルヨハン・ダール
SmallTalk72: アラン・ケイ
2001年 クリステン・ニガード, オルヨハン・ダール
2003年 アラン・ケイ
現在の主流


C++: ビャーネ・ストロヴストルップ (1979年)
Java: ジェームズ・ゴスリング, SUN (1991年)
オブジェクト指向の主要概念

オブジェクト指向を特徴付ける3つの概念:

カプセル化(クラス):
データとそれに関連する手続きを一体化し,他の部分から
分離(隠蔽)すること.分離した部分をクラスと呼ぶ.クラス
は言語中では型としての役割を持つ(抽象データ型).

継承:
あらかじめ基本となる機能を(親クラスとして)定義し,その
機能を引き継ぐ形で拡張機能(子クラス)を定義すること.

多相性(ポリモルフィズム):
オブジェクトの種類(クラス)を知ることなくその機能を使える
ようにする仕組み.(遅延束縛,動的結合)
モジュールプログラミング

カプセル化を用いた情報隠蔽は,C言語でも実現さ
れている.

モジュールプログラミング:
プログラムを機能毎に複数のモジュール(ファイル)
に分けて開発する手法.C言語では分割コンパイル
でサポートされている.
ヘッダと情報隠蔽

モジュールはヘッダ(list.h)を通じて利用.
《list.c》
モジュールを
利用するファイル
#include “list.h”
void init_list(List *lp) {
lp->num = 0;
}
int read_list(List *lp, int k) {
return lp->v[k];
}
:
情
報
隠
蔽
#include “list.h”
:
List l;
init_list(&l);
:
list.h が橋渡し
(インタフェース)の役割
実装の変更(1)
たとえばリストを線形リストを使うように変更.
 赤で示した部分が変更箇所,インタフェースは固定.

《list.c》
#include “list.h”
void init_list(List *lp) {
lp->next = NULL;
}
int read_list(List *lp, int k) {
List *p;
int n;
for (n = 0; n < k && …) {
:
《list.h》
typedef struct LIST {
int v;
List *next;
} List;
void init_list(List *lp);
int read_list(List *lp, int k);
実装の変更(2)

呼び出し側はほとんど変える必要がない.
《list.c》
#include “list.h”
void init_list(List *lp) {
lp->num = NULL;
lp->next
0;
}
int read_list(List *lp, int k) {
List
return
*p; lp->v[k];
}int n;
for (n = 0;
: n < k && …) {
:
#include “list.h”
:
List l;
init_list(&l);
:
list.h が橋渡し
(インタフェース)の役割
クラス(オブジェクト指向における
カプセル化)

抽象データ型を直接表現したもの.
関数を構造体の中に入れたものと考えてもよい.
typedef struct LIST {
int list[LIST_MAX];
int num = 0;
} List;
void init_list(List *lp) {
lp->num = 0;
}
int get_list_num(List *lp) {
return lp->num;
}
:
class List {
int list[LIST_MAX];
int num = 0;
void init_list(void) {
num = 0;
}
int get_list_num(void) {
return num;
}
:
}
クラスの定義

クラスは,インスタンス変数(フィールド)とメンバ関
数(メソッド)によって構成される.
class List {
int list[LIST_MAX];
int num = 0;
}
void init_list(void) {
num = 0;
}
int get_list_num(void) {
return num;
}
:
インスタンス変数
メソッド
クラスの利用



オブジェクト指向ではあるクラスを型とみなしたときの変数を
インスタンス(オブジェクト)と呼ぶ.
インスタンスは利用者側が生成する.
インスタンスのメンバへは”.”でアクセスする.
#include “list.h”
:
List l1, l2;
init_list(&l1);
init_list(&l2);
l1.num = 0;
l2.num = 0;
:
List l1 = new List();
List l2 = new List();
l1.init_list();
l2.init_list();
l1.num = 0;
l2.num = 0;
:
利用者側でListクラスのインスタンスを生成.
カプセル化のまとめ

クラス:
データとその操作をカプセル化したもの.
(モジュール×構造体?)

インスタンス(オブジェクト):
クラスを実体化したもの.クラスを型とみなしたときの変数に
相当.

フィールド: クラスが持つ変数.

メソッド: クラスが持つ関数.