« 理論と理論の戦い | トップページ | インスタンスとは何か »

2006年3月27日 (月)

オブジェクト指向の世界観

それは、クラス、オブジェクト、インスタンスの3分類の世界観である。
意味が分かれば非常に分かりやすい世界観である。
インスタンスとは分かりやすく言うと名前のことである。
クラス、オブジェクト、インスタンスは必ずしも1対1対応していない。

実際の私たちの経験する世界においては、実は直接的に感受できるのはオブジェクトのみなのである。
まずオブジェクトがあり、それに名前を付け、そしてクラスを発見するのである。
だから、3つの内で最も中心的な存在はオブジェクトである。

クラスは設計図にあたるが、しかしそれは普段私たちがイメージして使用している設計図や設計書とは全く異なるものである。
言ってみればそれはプラトンのいうイデアに当たるものである。
(しかしプラトンのイデアとは全く同じではない)

たとえば、犬のクラスとは何か。
それは犬のパターン法則である。
DNAのパターンといっても良いが、しかしDNAはまだオブジェクトなのである。
正確には、DNAのクラスからDNAオブジェクトが生成されて、そのDNAオブジェクトから犬のオブジェクトが生成されるという流れとなる。
DNAのクラスとは何か。それは塩基配列のパターンである。
パターンは形而上的な存在であって物質的な存在ではないのがわかるだろう。
敷衍していうと、クラスとはこのように非物質的・形而上的な存在なのである。
(我々の世界でいうならば、である)

犬のオブジェクトにどのような名前を付けるかは命名者の自由である。
つけられた名前、これがそのオブジェクトのインスタンスとなる。
少し考えれば分かるが、一つのオブジェクトを複数の名前で呼ぶことは可能である。
だからオブジェクトとインスタンスは1対1に対応しているとは限らない。
そしてこれも当たり前なのだが、全てのオブジェクトに名前が付けられているとは限らない。
むしろ、世界においては名前のないオブジェクトの方が多い。
だから名前の無いオブジェクトもあり得る。

ちなみにJavaではそのような名前の無いオブジェクトは文法的に作ることができない。
また、名前(インスタンス)を別のオブジェクトに割り当てることによってそのような無名のオブジェクトを一時的に作ることも可能ではあるが、そのようなオブジェクトはその後使用不能であるとみなされるので(Javaの世界では名前のないオブジェクトそのものを扱うことはできないから)ガーベジコレクタによって破棄されてしまうのである。

・実世界のクラスとオブジェクト
クラスとオブジェクトの関係についてみてみよう。
クラスからオブジェクトを作成するが、Javaではコンストラクタの機能によってクラスから複数の種類のオブジェクトを作成することが可能となっている。
これは、オブジェクト指向に独特の機能である。
現実世界でのクラスに相当する存在(形而上的存在)とオブジェクトの対応関係は不明である、というのが私の見解である。
たとえば、製品の設計図やDNAなどをクラスとする例(よくある例)では、それらはオブジェクトと1対1関係にあるようにみえる。
もっとも、クラスにおいてもデフォルトコンストラクタならばクラスとオブジェクトは1対1の関係にあるが。

・オブジェクトとインスタンスの区別
よく、オブジェクトとインスタンスを同一視する解説や説明があるが、無論間違っている。
もし、同一視しても問題ないのならば、2つの概念は必要ない。オブジェクトかインスタンスのどちらか一方だけですむはずである。
ほとんどの入門書において、クラスとオブジェクト(あるいはインスタンス)の区分けは明快だが、オブジェクトとインスタンスの区分けは曖昧であるか無い場合がほとんどである。
だから初心者は必然的にオブジェクトとインスタンスの区別で躓くことになるのである。

|

« 理論と理論の戦い | トップページ | インスタンスとは何か »

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/66849/1180984

この記事へのトラックバック一覧です: オブジェクト指向の世界観:

« 理論と理論の戦い | トップページ | インスタンスとは何か »