オブジェクト指向言語論 第八回 知能情報学部 新田直也.

Similar presentations


Presentation on theme: "オブジェクト指向言語論 第八回 知能情報学部 新田直也."— Presentation transcript:

1 オブジェクト指向言語論 第八回 知能情報学部 新田直也

2 オブジェクト指向の歴史 実は起源は明らかではない. チューリング賞: 現在の主流
Simula67: クリステン・ニガード, オルヨハン・ダール SmallTalk72: アラン・ケイ チューリング賞: 2001年 クリステン・ニガード, オルヨハン・ダール 2003年 アラン・ケイ 現在の主流 C++: ビャーネ・ストロヴストルップ (1979年) Java: ジェームズ・ゴスリング, SUN (1991年)

3 オブジェクト指向の主要概念 オブジェクト指向を特徴付ける3つの概念:
カプセル化(クラス): データとそれに関連する手続きを一体化し,他の部分から分離(隠蔽)すること.分離した部分をクラスと呼ぶ.クラスは言語中では型としての役割を持つ(抽象データ型). 継承: あらかじめ基本となる機能を(親クラスとして)定義し,その機能を引き継ぐ形で拡張機能(子クラス)を定義すること. 多態性(ポリモルフィズム): オブジェクトの種類(クラス)を知ることなくその機能を使えるようにする仕組み.(遅延束縛,動的結合)

4 モジュールプログラミング カプセル化はC言語でも実現されている.
情報隠蔽,関心事の分離,カプセル化.

5 モジュールの例 配列を用いたリストモジュール(list.c) 《list.c》 《list.h》 #include “list.h”
void init_list(List *lp) { lp->num = 0; } int read_list(List *lp, int k) { return lp->v[k]; : #define MAX_LIST 1000 typedef struct LIST { int num; int v[MAX_LIST]; } List; void init_list(List *lp); int read_list(List *lp, int k); :

6 モジュールによる情報隠蔽 関数の定義(実装)はカプセル化され隠蔽される. 《list.c》 情報隠蔽 他のファイル から見えない
#include “list.h” void init_list(List *lp) { lp->num = 0; } int read_list(List *lp, int k) { return lp->v[k]; : 情報隠蔽 他のファイル から見えない

7 モジュールの利用方法 モジュールはヘッダ(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 list.h が橋渡し (インタフェース)の役割

8 実装の変更(1) たとえばリストを線形リストを使うように変更. 赤で示した部分が変更箇所,インタフェースは固定. 《list.c》
《list.h》 #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 && …) { : typedef struct LIST { int v; List *next; } List; void init_list(List *lp); int read_list(List *lp, int k);

9 実装の変更(2) 呼び出し側はまったく変える必要がない. 《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” void init_list(List *lp) { lp->next = NULL; } int read_list(List *lp, int k) { List *p; int n; for (n = 0; n < k && …) { : #include “list.h” : List l; init_list(&l); list.h list.h が橋渡し (インタフェース)の役割

10 モジュールプログラミングのまとめ モジュールプログラミング:
モジュール中の大域変数と関数定義はカプセル化され,他のモジュールから隠蔽される. モジュールのインタフェースは公開される. 利用者はインタフェースのみ知っていれば利用できる. 利用者は実装の変更の影響を受けない.

11 クラス 抽象データ型を直接表現したもの. 関数を構造体の中に入れたものと考えてもよい. typedef struct LIST {
int list[LIST_MAX]; int num = 0; } List; class List { int list[LIST_MAX]; int num = 0; void init_list(void) { num = 0; } int get_list_num(void) { return num; : void init_list(List *lp) { lp->num = 0; } int get_list_num(List *lp) { return lp->num; :

12 クラスの定義 クラスは,インスタンス変数(フィールド)とメンバ関数(メソッド)によって構成される. インスタンス変数 メソッド
class List { int list[LIST_MAX]; int num = 0; void init_list(void) { num = 0; } int get_list_num(void) { return num; : インスタンス変数 メソッド

13 クラスの利用 オブジェクト指向ではあるクラスを型とみなしたときの変数をインスタンス(オブジェクト)と呼ぶ.
インスタンスは利用者側が生成する. インスタンスのメンバへは”.”でアクセスする. #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クラスのインスタンスを生成.

14 カプセル化のまとめ クラス: データとその操作をカプセル化したもの. (モジュール×構造体?)
クラス: データとその操作をカプセル化したもの. (モジュール×構造体?) インスタンス(オブジェクト): クラスを実体化したもの.クラスを型とみなしたときの変数に相当. フィールド: クラスが持つ変数. メソッド: クラスが持つ関数.


Download ppt "オブジェクト指向言語論 第八回 知能情報学部 新田直也."

Similar presentations


Ads by Google