オブジェクト指向の用語はなかなか難しい.オブジェクトとインスタンスの違い,オブジェクトとクラスの関係がよく分からない,という議論が生じたので,ここで整理しておこう.
そもそも「オブジェクト」という言葉は抽象的な概念ではあるが,メモリ上にある何らかのデータのことと考えるのがいちばんしっくりくる.オブジェクト指向言語の場合は,そこに何らかのメソッドが紐付けられていることになる(Cで実装するなら,関数ポインタのテーブルが組み込まれてると考えると,イメージしやすいかな?)
クラスとインスタンスについては,「たい焼きの型がクラスで,そこから生産されるたい焼きがインスタンスだ」と説明できる.ひとつひとつの実体のことはオブジェクトと呼んでもよくて,クラスとの関係性で語るときには「インスタンス」という言葉を使う,という感じか.クラスオブジェクトなる概念が少し話をややこしくしている.この例でいえばクラスオブジェクト的なものは「たい焼きの型そのもの」のことだろう.
クラスを表すオブジェクト
「クラスオブジェクト」的なモノは何かについては,Rubyでの説明が分かりやすいのではないだろうか.
まず,Hogeというクラスを定義している.Hogeは new されて生成され,変数 fugaに代入される(というか,たぶんメモリ上のどこかに生成されて,そこへの参照が代入されている)モノが「オブジェクト」に相当する(Hogeのインスタンスとも表現できる).
fugaのクラスは何か?と問えば(fuga.class),Hogeである.Rubyは全てのモノが「オブジェクト」だから,その指しているものもオブジェクトなので,これがクラスのオブジェクトということになるわけだ.
Hogeのクラスは何か?と問えば(fuga.class.class),Classだそうな.すなわち,クラスオブジェクトのクラスはClassなんだって.そしてその親クラスはObjectだとのこと.
オブジェクト,キタ━━━━(゚∀゚)━━━━!!
実はその実体は何かといえば,クラスを表すオブジェクトも,メモリ上に確保されているデータである.繰り返しになるが,クラスとインスタンスは,雛形と実体と捉えればオーケー.オブジェクトはメモリ上の何か,と捉えれば,すっきり理解できるはず.
追記:
当初,クラスオブジェクトについて「ショウケースに飾ってある鯛焼きの食品サンプル?のこと.ちょっと違うかなあ.」と記述していたが,たい焼きの型そのものがオブジェクトであるという指摘を頂いた.たしかにそのとおり,というわけで,本文を修正した.
表現が難しいのは,クラスという「概念」はオブジェクトではないということだ.したがって,「クラス = オブジェクト」という表現は,受け入れがたい.クラスを表現するデータをオブジェクトと呼ぶということと,概念をオブジェクトと呼ぶということの区別,そこは重要なポイントであろう.
0 件のコメント:
コメントを投稿