3. 2011/3/17 オブジェクト指向プログラミング入門 6 3
基本形式
O をオブジェクトとする.オブジェクトは何らかのクラス C の
直接インスタンスである.
C は O の生成クラス,あるいは,単にジェネレータと呼ばれる
.
C はソフトウェアテキスト, O は実行時のデータ構造である.
オブジェクトの形式はクラスが持つ属性によって決まる.
オブジェクトはフィールドフィールド(個々の属性について1つずつ用意
されている要素)の集合に過ぎない.
例:クラス POINT
class POINT feature
x, y: REAL
… …ルーチンの宣言
end
3.4
-8.09
x
y
P_OBJ
(POINT)
5. 2011/3/17 オブジェクト指向プログラミング入門 6 5
本の単純な概念
例:クラス BOOK1
class BOOK1 feature
title: STRING
date, page_count: INTEGER
end
典型的なインスタンスの例:
レコードや構造型と違い,以下のようにフィールドに値を割当
てることはできない
b1: BOOK1
…
b1.page_count := 355
“The Red and the Black”
1830
title
date
(BOOK1)
341page_count
9. 2011/3/17 オブジェクト指向プログラミング入門 6 9
参照(1)
例:同じ「著者」オブジェクトへの参照を含む 2 つ
の「本」オブジェクト
“The Red and the Black”
1830
title
date
(BOOK3)
341page_count
“The Red and the Black”
1830
title
date
(BOOK3)
341page_count
“Stendhal”
“Henri Beyle”
name
real_name
(WRITER)
1842
birth_year
death_year
1783
author author
10. 2011/3/17 オブジェクト指向プログラミング入門 6 10
参照(2)
void の参照フィールドがあるオブジェクト
参照とは実行時に void (無効)かアタッチ状態( attached )かのいずれか
の値をとる.
アタッチ状態の場合,参照は1つのオブジェクトを示す(その場合,その参
照はその特定のオブジェクトにアタッチされているという).
定義:参照
“Candide, or Optimism”
1759
title
date
(BOOK3)
120
author
page_count
12. 2011/3/17 オブジェクト指向プログラミング入門 6 12
参照の宣言
クラス BOOK3 の定義
class BOOK3 feature
title: STRING
date, page_count: INTEGER
author: WRITE -- これが新しい属性
end
クラスが次のような標準的な形式で宣言されているときには必
ず,
class C feature … end
次の形式の宣言によって C 型と宣言されたすべてのエンティ
ティは
x: C
C 型のオブジェクトへの参照である値を表す
13. 2011/3/17 オブジェクト指向プログラミング入門 6 13
自己参照
対応するクラス間の顧客関係にも循環がある
class PERSON1 feature
name: STRING
loved_one, landlord: PERSON1
end
“Almaviva”name
landlord
(PERSON1)
loved_one
“Figaro”name
landlord
(PERSON1)
loved_one
“Susanna” name
landlord
(PERSON1)
loved_one
18. 2011/3/17 オブジェクト指向プログラミング入門 6 18
生成命令
単純な形式の生成命令: create x
x は生成命令のターゲットと呼ばれる
BOOK3 クラスの顧客クラス QUOTATION の例:
class QUOTATION feature
source: BOOK3
page: INTEGER
make_book is
do create source end
end
すべてのフィールドはデフォルトで初期化される
19. 2011/3/17 オブジェクト指向プログラミング入門 6 19
生成命令(2)
ターゲット x の型がクラス C に基づいた参照型であるとき, create x とい
う形式の生成命令の効果は次の3つのステップを実行することである.
C1 ● C の新しいインスタンス( C の個々の属性に対して1つずつ作られる
フィールドの集合から構成される)を作成する. OC を新しいインスタンス
とする
C2 ● 標準のデフォルト値に従って OC の個々のフィールドを初期化する
C3 ● x の参照値を OC にする.すなわち x に OC をアタッチする
基本生成命令の効果
参照値のデフォルト値は void である
BOOLEAN 値のデフォルト値は False である
CHARACTER 値のデフォルト値はヌルキャラクタである
数値( INTEGER 型, REAL 型, DOUBLE 型)のデフォルト値はゼロ(す
なわち,適切な型の値ゼロ)である
デフォルトの初期値
22. 2011/3/17 オブジェクト指向プログラミング入門 6 22
クラス POINT の例
class POINT1 creation
make_cartesian, make_polar
feature
… 前のバージョンに記述されている特性 :
x, y, ro, theta, translate, scale, …
feature {NONE}
make_cartesian(a,b: REAL) is
do x := a; y := b end
make_polar(r,t: REAL) is
do x := r*cos(t); y := r*sin(t) end
end -- クラス POINT1
顧客は次のような命令で点を生成する
create my_point.make_cartesian(0, 1)
create my_point.make_polar(1, Pi/2)
23. 2011/3/17 オブジェクト指向プログラミング入門 6 23
生成呼び出しの効果
最初の3つのステップは,基本生成命令と同
じ
create x.p(…) という形式の生成呼び出しを実行すると,次の4つのステッ
プが実行される.ただし,ターゲット x の型はクラス C に基づいた参照型で
あり, p はクラス C の生成プロシージャであり, (…) は必要ならば指定す
べき,このプロシージャの実引数の有効な並びを表す.
C1 ● C の新しいインスタンス( C の個々の属性に対して1つずつ作られる
フィール
ドの集合から構成される)を作成する.この新しいインスタンスを OC
と呼ぶこと
にする.
C2 ● 標準のデフォルト値に従って OC の各フィールドを初期化する.
C3 ● x の値(参照)を OC にアタッチする.
C4 ● 与えられた引数とともに OC に対してプロシージャ p 呼び出す.
生成呼び出しの効果
29. 2011/3/17 オブジェクト指向プログラミング入門 6 29
参照についてのその他の操作
参照をオブジェクトにアタッチする
class PERSON2 feature
name: STRING
loved_one, landlord: PERSION2
set_loved(l: PERSION2) is
do loved_one := l end
end
a.set_loved(r) の実行
“Almavia”
“Susanna” “Rosina”
r
(PERSON2)
(PERSON2)(PERSON2)
O1
O2 O3
name
landlord
loved_one
name
landlord
loved_one
name
landlord
loved_one
a
31. 2011/3/17 オブジェクト指向プログラミング入門 6 31
void という値
定義済みの特性 Void
特定の参照が void かどうかテストする
if x = Void then …
void の参照を作る
x := Void
x x
O1 O1
32. 2011/3/17 オブジェクト指向プログラミング入門 6 32
オブジェクトのクローニングと一
致
オブジェクトの新しいコピーを作る
x := clone(y)
オブジェクトの内容を比較する
equal(x,y)
783
‘A’
783
‘A’
783
‘A’
y y x
OY OY OX
33. 2011/3/17 オブジェクト指向プログラミング入門 6 33
オブジェクトのコピー
すでにあるオブジェクトのフィールドに上書
きしたい場合
x.copy(y)
y にアタッチされているオブジェクトの
フィールドが x に対応するフィールドにコ
ピーされる
x も y も void であってはならない
34. 2011/3/17 オブジェクト指向プログラミング入門 6 34
深いクローニングと比較
“Almaviva”name
landlord
(PERSON1)
loved_one
name
landlord
(PERSON1)
loved_one
name
landlord
(PERSON1)
loved_one
“Figaro” “Figaro”
O2
O1
O3
a
“Almaviva”name
landlord
(PERSON1)
loved_one
name
landlord
(PERSON1)
loved_one
name
landlord
(PERSON1)
loved_one
“Figaro” “Figaro”
O6
O5
O7
“Almaviva”name
landlord
loved_one
O4
b
b := a
c
c := clone(a)
d
d := deep_clone(a)
同様に deep_equal(x,y) もある
36. 2011/3/17 オブジェクト指向プログラミング入門 6 36
STORABLE クラス
STORABLE の基本的な特性の形式
store(f: IO_MEDIUM)
x.store(f) という形式の呼び出しを実行すると, x にア
タッチされているオブジェクトがそのすべての依存オブ
ジェクトと一緒に f に関連付けられているファイルに保
存される
x の生成クラスは STORABLE の子孫でなければならな
い
x にアタッチされているオブジェクトをその保存される
構造の先頭オブジェクト( head object )という.
retrieved(f: IO_MEDIUM): STORABLE
retrieved(f) の結果として,前の store 呼び出しによって
f に保存された完全なオブジェクト構造と同一なオブ
ジェクト構造が得られる
37. 2011/3/17 オブジェクト指向プログラミング入門 6 37
複合オブジェクトと拡張型
実行時の値が C のインスタンスそのものであるエンティティ x が必要
な場合,次のように宣言する
x: expanded C
あるオブジェクト O の1つまたは複数のフィールド自体がオブジェク
ト( O のサブオブジェクトと呼ばれる)であるとき, O は複合オブ
ジェクトであるという
複合オブジェクトの書き方:
class COMPOSITE feature
ref: C
sub: expanded C
end
(C)
(C)
(COMPOSITE)
ref
sub
38. 2011/3/17 オブジェクト指向プログラミング入門 6 38
拡張型
拡張クラス
expanded class E feature
…
end
E 型として宣言されるエンティティはすべて拡張
型になる
次のような2つの場合,その型は拡張型である
● expanded C という形式である
● E という形式である.ただし, E は拡張クラスである.
定義:拡張型
39. 2011/3/17 オブジェクト指向プログラミング入門 6 39
拡張型の役割
効率性を向上させる
より良いモデル化を可能にする
以下の属性宣言がクラス C の中にあるとする
D1 ● ref: S
D2 ● exp: expanded S
D1 の宣言は C のすべてのインスタンスは S の特定のイン
スタンスについて「知っている」を表している
共有を許す
D2 の宣言は C のすべてのインスタンスは S のインスタン
スを1つ「含む」ということを表している
共有を許さない
統一されたオブジェクト指向的型体系の中での基本
型をサポートする
40. 2011/3/17 オブジェクト指向プログラミング入門 6 40
オブジェクト間の「知っている」と
いう関係と「含む」という関係
class WORKSTATION feature
k: expanded KEYBOARD
c: expanded CPU
m: expanded MONITOR
n: NETWORK
…
end
(NETWORK)
KEYBOARD1
CPU1
MONITOR1
k
c
m
n
KEYBOARD1
CPU1
MONITOR1
k
c
m
n
KEYBOARD1
CPU1
MONITOR1
k
c
m
n
(WORKSTATION) (WORKSTATION) (WORKSTATION)「集約」と
いう関係を
表現してい
る
41. 2011/3/17 オブジェクト指向プログラミング入門 6 41
拡張型の性質
E 型の拡張エンティティ x について
x の値は常にオブジェクトなので,絶対に void にはならな
い
x = Void の結果は常に偽になる
クラス D に expanded C 型の属性が含まれている
場合,クラス C は expanded D 型の属性を持つこ
とはできない
「拡張顧客」は次のように定義されたクラス間の関係であるとする.すなわ
ち, C のいずれかの属性が S に基づく拡張型である(つまり, expanded S
であるか, S が拡張クラスである場合には単に S )ならば, C は S の拡張
顧客である.
したがって,拡張顧客という関係に循環が含まれることがあってはならない
.
拡張顧客の規則
42. 2011/3/17 オブジェクト指向プログラミング入門 6 42
サブオブジェクトへの参照はだめ
実装の側面
ガーベッジコレクションが効率良く実装できる
モデリングの視点
システム記述を単純化することになる
(C)
(E)
(COMPOSITE1)
other
sub
ref
x
y
OE
OC
O_CMP1
43. 2011/3/17 オブジェクト指向プログラミング入門 6 43
アタッチメント:参照と値の意味
アタッチメント x := y の効果
ソース y の型→
↓ ターゲット x
の型
参照型 拡張型
参照型 参照のアタッチメ
ント
クローン.
x := clone(y) の効
果
拡張型 コピー.
x.copy(y) の効果
( y が void なら失
敗)
コピー.
x.copy(y) の効果
44. 2011/3/17 オブジェクト指向プログラミング入門 6 44
アタッチメント:参照と値の意味
比較 x = y の意味
y の型→
↓x の型
参照型 拡張型
参照型 参照の比較 equal(x,y)
x が void でない場合はオブ
ジェクトの比較で, x が void
の場合は偽
拡張型 equal(x,y)
y が void でない場合はオブ
ジェクトの比較で, y が
void の場合は偽
equal(x,y)
オブジェクトの比較