クラスとインスタンス
前記事でオブジェクト指向プログラミング言語には下の3つの概念があると書きました。
・インヘリタンス(継承)
・ポリモフィズム(多態性)
・ダイナミックバインディング(動的束縛)
これを理解するには、クラスというものを知る必要がありそうなので、先にクラスから手を付けてみる。
平たく言えば、オブジェクト指向プログラミングってのはバラバラの部品をグループに分けて安全性・再利用性を高めて効率よくプログラムすること。
オブジェクト指向プログラミング言語は、これを可能にするための言語ってことだけど、具体的にはどういう言語なの?ってとこだよな。
実際、アクションスクリプトはオブジェクト指向プログラミング言語なわけだから、アクションスクリプトを見ながら考えてみる。
アクションスクリプトで、まず知らないといけないのが「クラス」。
何気なく使ってるけど「クラス」って何よ?
プログラミングで書いたように、アクションスクリプトも機能ごとに分類されており、それをクラスという。
例えばテキスト関係を担うクラス・サウンド関係を担うクラスといった風に分けられている。
クラスを見てみると主に「プロパティ」と「メソッド」で構成されている。
プロパティとは性質のことで、座標・大きさ・名前など性質を現すもの。
メソッドは命令のことで、誰に何をさせるかを命令するもの。
この他にクラスによってはイベントや定数といったものがある。
こういったプログラムの部品となるコードを使いやすく分類したのがクラス。
ということは、クラスってのはコードの集まりに過ぎない。
これを実際にタイムライン上で使うには、「インスタンス」を生成しなければならない。
インスタンスとは、事実・実例といった意味で、ライブラリにあるmp3ファイルをタイムラインに配置するのと同じことになる。
ASでは、varステートメント・new演算子・コンストラクタを使って記述をする。
var mySound:Sound = new Sound();
//var インスタンス名:データ型 = new コンストラクタ名(引数);
オブジェクト
さて、クラスとインスタンスが出てきたところで「オブジェクトとはなんぞや?」を考えてみる。
今まで「オブジェクト」という言葉をあえて避けてきた。
というのも、いろいろ読んだけど、解説によってオブジェクトの捉え方が違っているから。
ここがわからなくて、いつも挫折していた。
でも「オブジェクト指向」というくらいだから、オブジェクトが解らないと先に進めない。
しかもややこしいことにオブジェクトクラスとかあるし、混乱する。
オブジェクトの捉え方がどう違うかというと、
・クラスもインスタンスもオブジェクト
・クラスはクラス、インスタンスがオブジェクト
・クラスはオブジェクト、インスタンスはインスタンス
どれが正解?と思うんだけど、たぶんどれも正解。
もっとも解りやすいと思った記事を貼っておく。
IT Pro 第1回「オブジェクト、クラス、インスタンスの関係」
この記事を読むと、「クラスもインスタンスもオブジェクトである」と捉えるのが自然な気がした。
では、アクションスクリプトでは、どのように捉えているのだろう?
AdobeFlash CS3ドキュメンテーションより引用
オブジェクト指向プログラミング (OOP) は、情報 (データ値) と機能が含まれる個別のエレメントであるオブジェクトとしてコードをグループ化することによって、プログラム内のコードを構成する方法です。
フフフ・・・。Adobeがもっと解りやすく解説してくれればこんな苦労も無いのに、終始このように専門家しかわからないような書き方なので困る。
私的解釈すると、データ(プロパティや定数など)とメソッドが含まれるものをオブジェクトとして捉える。さらには「コードをグループ化」と書いてある。
これってクラスのことだよね。
さらにAdobeの解説を見てみる。
クラス : 特定の型のオブジェクトの構造とビヘイビア (そのデータ型のオブジェクトのテンプレートや設計図など) の定義。
インスタンス : プログラムで作成される実際のオブジェクト。
他でクラスの解説を読んでいると「クラスはオブジェクトの雛形」という表現もあった。たぶんそういうことを言いたいんだと思う。
でもオブジェクトの雛形とかいわれてもピンとこない。
で、先ほどのIT-proの解説に準えると、クラスは第ニ実体。
実体なんだけど、グループ化されたコードの集合体なので、抽象的。
抽象的なので、このままタイムライン上で使うことができない。
実際に使えるように具体化するためにインスタンスという第一実体を作る。
ということで、結論は「クラスもインスタンスもオブジェクト」
【追記】
野中文雄氏のサイトを見ると、「アクションスクリプトにおいてクラスは単なる抽象的な存在ではない」と書かれてあった。
でもこれは多言語と比較して抽象的じゃないということだと思う。
クラスはオブジェクトでないとする言語からみると、アクションスクリプトはクラスもオブジェクトとされるので、抽象的とはいえないということなのかな?と解釈。
アクションスクリプトしか知らない私にとっては、インスタンスからみたらクラスは抽象的な存在であるように思う。
野中文雄氏のサイト ActionScript3.0言語の概要より
オブジェクト指向は物事の捉え方の一つに過ぎませんので、プログラミング以外にもあてはまります。
例えば、オブジェクト指向分析なんて言葉もあります。それはさておき、
プログラミングの場合、コンピューターにオブジェクト指向を理解してもらうためには、まず、コンピューターの言葉でオブジェクト指向を定義してやらなくてはなりませんでした。
歴史的経緯もいろいろありますが、その結果、「オブジェクトとは、データとその振る舞いを一つにまとめたもの」という事になるわけです。
石の例でいえば、石の一つ一つは区別されますので、それぞれ個別のデータと考えられます。そして、石には「地面に向かって突進する」という振る舞いがあります。したがって、石(の一つ一つ)はオブジェクトという事になります。
さて本題ですが、クラスという概念の存在や、それをオブジェクトから分離する仕組みは、必ずしもオブジェクト指向の要件ではありません:あくまでも、オブジェクト指向を便利にするための道具にすぎません。実際、クラスという概念が組み込まれていないプログラミング言語も存在します。
(無論、クラスの仕組みをオブジェクトを使って組み込む事もできます。その場合、個々のクラスにはデータと振る舞いがありますので、やはりオブジェクトと見る事ができるのです。)