VBAの勉強を始めてみた

色々試しています。

クラスを実体化するってどういうこと?(Tips-13)

クラスを実体化することの比喩として、「たい焼きの型」と「たい焼き」の話がしばしば用いられます。
しかしこの比喩で「なるほど!そうだったのか」と一発で理解できる人は何人いるのでしょうか?
回り道をし、色々な角度から考えを巡らせて理解に至った人が、再び「たい焼きの型」と「たい焼き」の話に戻ってきた時に初めて「なるほど!そうだったのか」と思うのではないでしょうか?
比喩だけで理解できないのは、具体的なことを何も説明していないからです。当然といえば当然です。

 

なので、今回はクラスを実体化することについて、たい焼きの話よりも少しだけ実機寄りの例え話をします。
その後に実機の動作を説明してみたいと思います。

 

~~~ここから例え話~~~
VBA初心者のKさんは汎用的に使用頻度の高いルーチンをメモ帳にたくさん保存していました。
必要に応じて標準モジュールなどにコピペして使っています。
クラスライブラリならぬ、汎用ルーチンライブラリ(メモ帳Ver)といったところです。
メモ帳の中ではプログラムは動作しません。何故なら汎用ルーチンが書かれているだけの単なるテンプレートだからです。

f:id:kouten0430:20181228143250j:plain

 

これを、標準モジュールなどにコピペして初めて動作するプログラムとして実体化されます。

f:id:kouten0430:20181228143317j:plain


メモ帳のテンプレートからコピペしていくつでも実体を作ることができます。

f:id:kouten0430:20181228143417j:plain


あれ・・・・・・?これって「たい焼きの型」から「たい焼き」を作る話に似ているような気がする。
~~~ここまで例え話~~~

 

次は実際にクラスを実体化することの説明です。例え話とは次の点が異なります。

  • クラスは標準モジュールにではなく、メモリの中に実体化される(実体化されたものをオブジェクトと呼ぶ)
  • 汎用ルーチン群を種類別に整理してクラスにまとめることができる(〔汎用ルーチン1・汎用ルーチン2・汎用ルーチン3〕→クラスA、〔汎用ルーチン4・汎用ルーチン5〕→クラスB ・・・・・・のように)。なお、クラスにまとめられた汎用ルーチンはメソッドと呼ぶ。
  • 汎用コードのコピペと違い、オブジェクトの内部は見えない。(内部を見えなくすることで機能を抽象化することができる)
  • オブジェクトの内部は外部から直に操作できない。操作はメソッドやプロパティを窓口にして行う。(不整合なデータを渡してプログラムの挙動がおかしくなるようなことを防ぐ)

 

クラスモジュールで作られたクラスAを例に流れを見てみましょう。

クラスモジュール内でプログラムが動作しないのはメモ帳の場合と同じです。(あくまでテンプレートと考える)

f:id:kouten0430:20181228143529j:plain

 

①標準モジュール側で New クラス名 とすることでクラスからメモリ内にオブジェクトが実体化されます。

f:id:kouten0430:20181228143656j:plain

 

②Set 変数 で、変数がオブジェクトを参照します。

f:id:kouten0430:20181228143746j:plain

 

③変数.メソッド 又は 変数.プロパティのように記述するとオブジェクトの機能を使用することができます。

f:id:kouten0430:20181228143837j:plain

 

④Set 変数 = Nothing でオブジェクトへの参照を解除します。オブジェクトは何処からも参照されなくなったら、メモリ上から破棄されます。

f:id:kouten0430:20181228143911j:plain

 

クラスからは New でいくつでもオブジェクトを作ることができます。 

f:id:kouten0430:20181228150151j:plain

 

外部ライブラリ(クラスライブラリ)などから、クラスを実体化する場合も流れは同じです。

 

さて、たい焼きよりも実機寄りの例え話から始めて、次に実機の流れを説明してみました。イメージは掴みやすかったでしょうか?

今回は大まかな流れだけを説明するために、メモリの中身は「オブジェクト」とだけ表現しました。次回以降、メモリの中でオブジェクトがどうなっているのかちょっとだけ説明してみようと思います。

 

※クラスモジュールでクラスを自作する方法については、thom さんの「クラスモジュール超入門」の記事でとても分かりやすく解説されています。

thom.hateblo.jp