Visual Basic のオブジェクトの概要
更新 : 2007 年 11 月
オブジェクトは、データおよびそのデータを操作するメソッドを含む構造体のことです。Visual Basic で行うほとんどすべての作業は、オブジェクトに関わっています。オブジェクト指向プログラミングの経験がない場合は、まず以下の用語と概念の説明を参照してください。
クラスとオブジェクト
"クラス" と "オブジェクト" という用語は、オブジェクト指向プログラミングでは頻繁に使用されるため、混同しやすい用語であると言えます。一般に、classはある対象の抽象表現であり、オブジェクトはそのクラスを表す実例です。ただし共有クラス メンバは例外で、クラスのインスタンスで使用することも、クラスの型として宣言されたオブジェクト変数で使用することもできます。
フィールド、プロパティ、メソッド、およびイベント
クラスは、フィールド、プロパティ、メソッド、およびイベントから構成されています。フィールドとプロパティは、オブジェクトに格納されている情報を表します。フィールドは、直接読み取ったり設定したりできるので変数と似ています。たとえば、"Car" というオブジェクトがある場合、その色を "Color" というフィールドに格納できます。
プロパティは、フィールドと同じように取得と設定ができます。ただし、プロパティ Get プロシージャとプロパティ Set プロシージャによって実装すると、設定値や戻り値をより細かく制御できます。これらのプロシージャは、格納される値とその値を使用するプロシージャとの仲介層として機能するため、データを切り離して、割り当ておよび取得の前に値を確認できます。
メソッドは、オブジェクトが実行できる処理を表します。たとえば、"Car" オブジェクトのメソッドとしては、"StartEngine"、"Drive"、"Stop" などが考えられます。メソッドを定義するには、プロシージャ (Sub ルーチンまたは関数) をクラスに追加します。
イベントは、オブジェクトがほかのオブジェクトやアプリケーションとの間で送受信する通知です。イベントを使うと、ある特定の動作が起こるたびにオブジェクトに処理を実行させることができます。たとえば、"Car" クラスのイベントとしては、"Check_Engine" イベントなどが考えられます。Microsoft Windows はイベント ドリブンのオペレーティング システムなので、ほかのオブジェクト、アプリケーション、マウス クリックやキー入力などのユーザー入力によってイベントが発生します。
カプセル化、継承、およびポリモーフィズム
上で説明したフィールド、プロパティ、メソッド、およびイベントは、オブジェクト指向プログラミングの法則を半分しか伝えていません。真のオブジェクト指向プログラミングは、カプセル化、継承、およびポリモーフィズムの 3 つの特性をオブジェクトでサポートする必要があります。
カプセル化とは、関連するプロパティ、メソッド、およびその他のメンバのグループが 1 つの単位またはオブジェクトとして扱われることを意味します。オブジェクトは、プロパティの変更やメソッドの実行を制御できます。たとえば、プロパティが変更される前に値を確認できます。また、カプセル化により、オブジェクトの実装の詳細を隠すことができるため、実装を後で変更するのが簡単になります。これをデータの隠ぺいと呼びます。
継承は、既存のクラスに基づいて新しいクラスを作成する機能です。新しいクラスは、基本クラスのすべてのプロパティ、メソッド、およびイベントを継承します。また、プロパティやメソッドを追加することによってカスタマイズできます。たとえば、"Car" クラスを基にして "Truck" という新しいクラスを作成できます。"Truck" クラスは、"Car" クラスの "Color" プロパティを継承します。また、"FourWheelDrive" などのプロパティを追加できます。
ポリモーフィズムを採用すると、複数のクラスがあり、各クラスが同一プロパティや同一メソッドを異なる方法で実装していたとしても、交換して使用できます。ポリモーフィズムは、オブジェクト指向プログラミングを行う際の重要な特性です。ポリモーフィズムによって、その時点で使用されているオブジェクトの型に関係なく、同じ名前の項目を使用できるようになります。たとえば、"Car" という基本クラスがある場合、ポリモーフィズムが実現されていると、複数の派生クラスにそれぞれ異なる "StartEngine" メソッドを定義できます。"DieselCar" という派生クラスの "StartEngine" メソッドは、基本クラスの "StartEngine" メソッドとまったく異なっていてもかまいません。他のプロシージャやメソッドは、その時点で使用されている "Car" オブジェクトの型に関係なく、同じ方法で派生クラスの "StartEngine" メソッドを使用できます。
オーバーロード、オーバーライド、およびシャドウ
オーバーロード、オーバーライド、およびシャドウの概念は、似ているためにしばしば混同されます。これらは 3 つともすべて同じ名前のメンバを作成するための方法ですが、それぞれ重要な違いがあります。
オーバーロードされたメンバを使うと、同じ名前を持つプロパティまたはメソッドの別のバージョンを提供できます。ただし、名前は同じでも、パラメータの数またはパラメータのデータ型は異なっている必要があります。
オーバーライドされたプロパティやメソッドを使うと、継承したプロパティやメソッドを派生クラスで置き換えることができます。オーバーライドされたメンバの引数のデータ型と数は同じである必要があります。派生クラスは、オーバーライドされたメンバを継承します。
シャドウされたメンバは、ローカルな範囲内で、より広いスコープを持つメンバの代わりに使用されます。シャドウの対象となる型に制約はありません。たとえば、継承した同じ名前のメソッドをシャドウするプロパティを宣言できます。シャドウされたメンバは継承できません。