オブジェクト指向言語論 第五回 知能情報学部 新田直也 オブジェクト指向の歴史 実は起源は明らかではない. チューリング賞: 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クラスのインスタンスを生成. カプセル化のまとめ クラス: データとその操作をカプセル化したもの. (モジュール×構造体?) インスタンス(オブジェクト): クラスを実体化したもの.クラスを型とみなしたときの変数に 相当. フィールド: クラスが持つ変数. メソッド: クラスが持つ関数.
© Copyright 2024 ExpyDoc