クラス : オブジェクトの設計図
更新 : 2007 年 11 月
クラスはオブジェクトのシンボリックな表現です。設計図が建築物を構成する項目を説明するものであるのと同じように、クラスはオブジェクトを構成するプロパティ、フィールド、メソッド、およびイベントを説明するものです。1 枚の設計図から複数の建築物を建造できるように、1 つのクラスから必要な数のオブジェクトを作成できます。建築物を使用する人の出入り (アクセス) できる部分が設計図によって定義されるように、クラスは、カプセル化を通じて、オブジェクト項目へのユーザー アクセスを制御できます。
クラスとオブジェクト
クラスという用語とオブジェクトという用語は同じ意味で使用される場合がありますが、実際には、クラスはオブジェクトの構造を表すのに対し、オブジェクトはクラスの使用可能なインスタンスです。各インスタンスは、クラスの独立したコピーです。オブジェクトはクラスのインスタンスであるため、オブジェクトを作成する操作はインスタンス化と呼ばれます。
設計図との対比を使って説明すると、クラスは設計図であり、オブジェクトはその設計図を基にした建築物です。通常は、1 つのオブジェクト内のデータを変更しても、他のオブジェクト内のデータは変更されません(ただし、共有メンバの場合は例外です。共有メンバは、Shared 修飾子を指定して宣言されたクラス メンバであり、クラスの特定のインスタンスとは独立に存在します)。
カプセル化
カプセル化は、関連付けられた複数の項目から成るグループを包含し、グループへのアクセスを制御する機能です。クラスは、項目をカプセル化する最も一般的な方法の 1 つです。下の例の BankAccount クラスは、銀行の口座を表すメソッド、フィールド、およびプロパティをカプセル化します。
カプセル化を使用しない場合、たとえば、銀行口座の情報を保持および管理するためのプロシージャや変数を個別に宣言する必要があります。この方法では、一度に複数の口座を処理するのは困難です。カプセル化を使用すると、データおよびプロシージャを BankAccount クラスにまとめ、1 つのユニットとして扱うことができます。各口座はクラスの一意のインスタンスで表現されるため、混乱することなく、一度に複数の銀行口座を処理できます。
カプセル化により、データとプロシージャの使用も制御できます。Private や Protected などのアクセス修飾子を使用することで、外部のプロシージャによるクラスのメソッドの実行や、プロパティやフィールドのデータの読み取りおよび変更を禁止できます。クラスの外部で使用されるのを防ぐためには、クラスの内部的な詳細を Private として宣言しておく必要があります。この技法は、データの隠ぺいと呼ばれ、口座残高などの顧客情報を保護するための方法です。
カプセル化の基本的な規則として、クラス データは Property プロシージャまたはメソッドだけを通じて変更または取得します。クラスの実装の詳細を隠ぺいすることで、望まない方法でクラスが使用されるのを防ぎます。また、互換性の問題を発生させることなく、後でこれらの項目を変更できます。たとえば、BankAccount クラスの将来のバージョンでは、AccountBalance フィールドのデータ型に依存する他のアプリケーションに影響を与えることなく、このフィールドのデータ型を変更できます。
継承
Visual Basic の構造体と同様に、関連する項目のグループをカプセル化するデータ型をクラスを使用して定義できます。しかし、構造体とは異なり、Visual Basic のクラスでは、他のクラスの特性を継承および拡張できます。新しいクラスの基になるクラスは、基本クラスと呼ばれます。基本クラスから派生したクラスは、派生クラスと呼ばれます。派生クラスは、基本クラスのプロパティ、メソッド、およびイベントをすべて継承します。つまり、一度開発およびデバッグしたクラスは、他のクラスの基本クラスとして再利用できます。
次の例は、汎用の銀行口座を表す基本クラスを定義しています。また、基本クラスのプロパティを継承し、当座預金を表すようにカスタマイズされたクラスも定義しています。
Class BankAccount
Private AccountNumber As String
Private AccountBalance As Decimal
Private HoldOnAccount As Boolean = False
Public Sub PostInterest()
' Add code to calculate the interest for this account.
End Sub
ReadOnly Property Balance() As Decimal
Get
' Return the available balance.
Return AccountBalance
End Get
End Property
End Class
Class CheckingAccount
Inherits BankAccount
Sub ProcessCheck()
' Add code to process a check drawn on this account.
End Sub
End Class
継承の詳細については、「継承の基本」を参照してください。
共有メンバ
既定では、クラスのデータはクラスの各インスタンスに固有になります。ただし、1 つのクラスから作成したすべてのオブジェクト間で、1 つのデータ項目を共有する方が都合のよい場合もあります。このような場合には、Shared 修飾子を使用して、変数の同じ値をクラス内のすべてのインスタンスで共有できるようにします (共有メンバは、他のプログラミング言語では "静的メンバ" と呼ばれる場合もあります)。共有メソッドは、事前にクラスのインスタンスを作成しなくても、クラス名を使用して直接呼び出すことができます。
共有メンバの詳細については、「Visual Basic の共有メンバ」を参照してください。
シャドウ
派生クラスで Shadows キーワードを使用すると、継承したメンバと同じ名前のメンバを宣言できます。シャドウされるメンバとシャドウするメンバが、同じデータ型である必要はありません。たとえば、プロパティは Integer 型の変数をシャドウできます。
共有メンバの詳細については、「Visual Basic におけるシャドウ」を参照してください。