しかし、プロパティの実装方法は、かなり複雑でした。
もっと簡単にできないのでしょうか?
なぜ、わざわざプロパティプロシージャやモジュールレベル変数を内部でいじくり回すようなことをしたのでしょうか?
「プロパティって、なんで こんな まわりくどいことすんの?」
「それは、カプセル化の原則を守っているからです。」
実は、クラスモジュールに“Public な”モジュールレベル変数を追加するだけで、それがプロパティになります。
Option Explicit
Public Name As String 'Name プロパティ
しかし、これではプロパティとして利用することができない場合があります。
読み取り専用のプロパティが必要な場合は、プロパティプロシージャを利用する方法しかありません。(Property Get プロシージャのみを記述する方法。)
値が変更されると他の部分に影響を与えるようなプロパティ(たとえば Color プロパティなど)の場合は、Property Let(Set) プロシージャにそのコードを記述します。
他にも、Property Let(Set) プロシージャには、代入された新しい値がプロパティの範囲に当てはまるかを検証し、条件によって処理を分ける、などの機能を付け加えることができます。
このように、プロパティは、構造体のデータにはない側面を持っています。特に理由がない限り、パブリック変数によるプロシージャの実装は避けます。面倒でも、プロパティプロシージャを利用したコーディングをするようにします。(そのようなコーディングに慣れるべきです。)
Public や Private という「スコープレベル(有効範囲)」が頻繁に出てきました。
変数やプロシージャには有効範囲というものがあり、その寿命や存在範囲を設定することで、データを守ったり管理したりします。
具体的には、モジュール内で Private として宣言したものは「モジュールレベル」の変数になります。モジュール内全体で有効な変数となり、モジュールのメモリが解放されない限り、データは生き続けます。ただし、他のモジュールからは、それを直接見ることができません。
逆に、Public は、モジュールレベルであることに加え、外部にも公開するという要素です。標準モジュールで Public として宣言したものは「グローバルレベル」になり、プロジェクト内の全てのモジュールから参照することができるようになります。クラスモジュール内での Public 宣言も、外部に公開することを意味します。(上の Public 変数がプロパティになるという原理もこれです。)
クラスモジュールでは、この Private と Public の使い分けが重要で、Public にしたものは、すべて「クラス(オブジェクト)の要素」とされます。プロパティプロシージャを Public で宣言していましたが、これを Private にすると、たちまちクラスのプロパティではなくなります。
そして、わざわざプロパティ変数を外部から隠してプロパティプロシージャを利用した理由が、ここにあります。
プロパティは、スコープレベルという「殻」で包まれたオブジェクトの内部と外部を結ぶ「インターフェイス(外部と内部を繋ぎ合わせるもの)」です。

オブジェクトには、外から見る(触れる)ことのできない内部の機構が備わっています。これは、「カプセル化」や「データ隠蔽」と呼ばれる、クラスを定義する際の決まり事のようなものなのです。
クラス・オブジェクトの特徴のひとつに、「独立した存在である」ことがあります。“独立した存在”ということは、同時に“それ自身が自分自身を管理できること”、“外からそれの内部機構には容易に干渉できないこと”を意味します。
構造体の場合は、標準モジュールやフォームモジュールなど、ほとんどのモジュールに定義を記述することができますが、クラスの定義は、ひとつのクラスモジュールのみで行われます。
また、構造体変数は、どこからでもデータを読み書きすることができます。
一方、クラスのプロパティには、読み取り専用のものがあります。
データを外から容易に変更できることは、プログラムの規模が大きくなるに連れて、非常に危険で厄介な存在になります。みなさんも、変数をグローバルレベルやモジュールレベルで宣言して、それをいろんなプロシージャから呼び出すようなコードを書いているうちに、思わぬ不具合が発生したりした経験はありませんか?
構造体のデータは、単なる変数でしかないので、自分自身のデータを管理することはできず、データの整合性チェックなどは、データを利用する各処理プロシージャが行います。クラスの場合は、プロパティでデータを受け取るときに自分で整合性をチェックできるので、オブジェクトを利用するクライアント側では、詳細なチェックの必要はありません。
これが、インターフェイスとデータ隠蔽という、クラスがもつ大きな利点のひとつです。
ちょっと難しいかもしれませんが、とりあえずプロパティの実装方法は、「プロパティ変数とプロパティプロシージャ」という風に覚えてください。ここで説明していることは、クラスに慣れていくうちに、段々とわかってくると思います。
プロパティ実装の練習として、先の章で出てきた TV クラスに、電源の供給状態を表す PowerSupply プロパティ(Boolean 型)を実装してみてください。
ここで、「Boolean 型ならオーバーフローの心配はないし、モジュールレベルのパブリック変数でもいいんじゃない?」などと思わないでください。
電源を入れれば、即座に画面が表示されるでしょう。
それは、Property Let プロシージャから実行されます。
この一連の動作は、単純な変数にはマネできません。
やっぱり、手抜きなやり方はできません。