オブジェクト指向プログラミング (Visual Basic)
Visual Basic は、カプセル化、継承、ポリモーフィズムなど、オブジェクト指向プログラミングを完全にサポートします。
"カプセル化" とは、関連するプロパティ、メソッド、およびその他のメンバーのグループが 1 つの単位またはオブジェクトとして扱われることを意味します。
"継承" は、既存のクラスに基づいて新しいクラスを作成する機能です。
"ポリモーフィズム" とは、同じプロパティまたはメソッドを異なる方法で実装している複数のクラスを、交換して使用できることです。
このセクションでは、次の概念について説明します。
クラスとオブジェクト
"クラス" という用語と "オブジェクト" という用語は同じ意味で使われる場合がありますが、実際には、クラスはオブジェクトの "型" を表すのに対し、オブジェクトはクラスの使用可能な "インスタンス" です。 そのため、オブジェクトを作成する操作は "インスタンス化" と呼ばれます。 設計図との対比を使って説明すると、クラスは設計図であり、オブジェクトはその設計図を基にした建築物です。
クラスを定義するコード例を次に示します。
Class SampleClass
End Class
Visual Basic には、"構造体" と呼ばれる軽量バージョンのクラスも用意されています。構造体は、大きいオブジェクト配列を作成する必要があり、その配列に使用されるメモリの量を抑えたい場合に役立ちます。
構造体を定義するコード例を次に示します。
Structure SampleStructure
End Structure
詳細については次を参照してください:
クラス メンバー
各クラスには、さまざまな "クラス メンバー" を含めることができます。クラス メンバーには、クラスのデータを記述するプロパティ、クラスの動作を定義するメソッド、異なるクラスやオブジェクト間で通信するためのイベントが含まれます。
プロパティとフィールド
フィールドとプロパティは、オブジェクトに格納されている情報を表します。 フィールドは、直接読み取ったり設定したりできるので変数と似ています。
フィールドを定義するコード例を次に示します。
Class SampleClass
Public SampleField As String
End Class
プロパティには get プロシージャと set プロシージャがあり、これらを使用することで値の設定方法や戻り値をより細かく制御できます。
Visual Basic では、プロパティ値を格納するためのプライベート フィールドを作成するか、バックグラウンドでこのフィールドを自動的に作成し、プロパティ プロシージャの基本的なロジックを提供する、いわゆる自動的に実装されたプロパティを使用できます。
自動的に実装されるプロパティを定義するには:
Class SampleClass
Public Property SampleProperty as String
End Class
プロパティ値の読み取りと書き込みのために追加の操作を実行する必要がある場合は、プロパティ値を格納するフィールドを定義し、値を格納および取得する基本的なロジックを実装します。
Class SampleClass
Private m_Sample As String
Public Property Sample() As String
Get
' Return the value stored in the field.
Return m_Sample
End Get
Set(ByVal Value As String)
' Store the value in the field.
m_Sample = Value
End Set
End Property
End Class
ほとんどのプロパティには、プロパティ値の設定と取得を行うための両方のメソッドまたはプロシージャがあります。 ただし、読み取り専用または書き込み専用のプロパティを作成して、プロパティの変更や読み取りを制限することもできます。 そのためには、Visual Basic では ReadOnly
キーワードと WriteOnly
キーワードを使用します。 ただし、自動的に実装されるプロパティを読み取り専用または書き込み専用にすることはできません。
詳細については、以下を参照してください:
メソッド
"メソッド" は、オブジェクトが実行できる処理です。
Note
Visual Basic には、メソッドを作成する方法が 2 つあります。メソッドが値を返さない場合は Sub
ステートメントを使用し、メソッドが値を返す場合は Function
ステートメントを使用します。
クラスのメソッドを定義するコード例を次に示します。
Class SampleClass
Public Function SampleFunc(ByVal SampleParam As String)
' Add code here
End Function
End Class
クラスには、同じメソッドに対して、パラメーターの数やパラメーターの型が異なる複数の実装 ("オーバーロード") を含めることができます。
メソッドをオーバーロードするコード例を次に示します。
Overloads Sub Display(ByVal theChar As Char)
' Add code that displays Char data.
End Sub
Overloads Sub Display(ByVal theInteger As Integer)
' Add code that displays Integer data.
End Sub
ほとんどの場合、メソッドはクラス定義内で宣言します。 ただし、Visual Basic では、既存のクラスの実際の定義の外部にメソッドを追加できる "拡張メソッド" がサポートされています。
詳細については次を参照してください:
コンストラクター
コンストラクターは、特定の型のオブジェクトを作成するときに自動的に実行されるクラス メソッドです。 コンストラクターは、通常、新しいオブジェクトのデータ メンバーを初期化します。 コンストラクターは、クラスの作成時に 1 回だけ実行できます。 また、コンストラクター内のコードは常に、クラス内の他のすべてのコードより先に実行されます。 他のメソッドと同じように、コンストラクターにも複数のオーバーロードを作成できます。
クラスのコンストラクターを定義するコード例を次に示します。
Class SampleClass
Sub New(ByVal s As String)
// Add code here.
End Sub
End Class
詳細については次を参照してください:オブジェクトの有効期間: オブジェクトの作成と破棄
デストラクター
デストラクターは、クラスのインスタンスを消滅させるために使用します。 .NET Framework では、アプリケーション内のマネージド オブジェクトのメモリの割り当てと解放は、ガベージ コレクターによって自動的に管理されます。 ただし、アプリケーションで作成されるアンマネージ リソースを適切にクリーンアップするために、デストラクターも必要になることがあります。 1 つのクラスに定義できるデストラクターは 1 つだけです。
.NET Framework のデストラクターおよびガベージ コレクションの詳細については、「ガベージ コレクション」をご覧ください。
イベント
クラスやオブジェクトは、何か重要なことが起こった場合に、イベントを使用して他のクラスまたはオブジェクトに通知を送ります。 イベントを送信する (発生させる) クラスは "パブリッシャー" と呼ばれ、イベントを受信する (処理する) クラスは "サブスクライバー" と呼ばれます。 イベント、およびイベントの発生と処理の詳細については、「イベント」をご覧ください。
イベントを宣言するには、Event ステートメントを使用します。
イベントを発生させるには、RaiseEvent ステートメントを使用します。
宣言によってイベント ハンドラーを指定するには、WithEvents ステートメントと Handles 句を使用します。
イベントに関連付けるイベント ハンドラーを動的に追加、削除、変更できるようにするには、AddHandler ステートメントと RemoveHandler ステートメントに AddressOf 演算子を組み合わせて使用します。
入れ子になったクラス
別のクラス内で定義されているクラスを "入れ子になったクラス" と呼びます。 既定では、入れ子になったクラスはプライベートです。
Class Container
Class Nested
' Add code here.
End Class
End Class
入れ子になったクラスのインスタンスを作成するには、コンテナー クラスの名前に続けて、ドットと入れ子になったクラスの名前を指定します。
Dim nestedInstance As Container.Nested = New Container.Nested()
アクセス修飾子とアクセス レベル
すべてのクラスおよびクラス メンバーでは、"アクセス修飾子" を使って、他のクラスに提供するアクセス レベルを指定できます。
次のアクセス修飾子を使用できます。
Visual Basic の修飾子 | 定義 |
---|---|
Public | この型またはメンバーには、同じアセンブリ内の他のコードや、そのアセンブリを参照する別のアセンブリ内の任意のコードからアクセスできます。 |
Private | この型またはメンバーには、同じクラスのコードのみがアクセスできます。 |
Protected | この型またはメンバーには、同じクラスまたは派生クラスのコードのみがアクセスできます。 |
Friend | この型またはメンバーには、同じアセンブリ内の任意のコードからアクセスできますが、別のアセンブリからはアクセスできません。 |
Protected Friend |
この型またはメンバーには、同じアセンブリ内の任意のコード、または別のアセンブリ内の任意の派生クラスからアクセスできます。 |
詳しくは、「Visual Basic でのアクセス レベル」を参照してください。
クラスのインスタンス化
オブジェクトを作成するには、クラスをインスタンス化する (クラスのインスタンスを作成する) 必要があります。
Dim sampleObject as New SampleClass()
クラスをインスタンス化した後は、インスタンスのプロパティやフィールドに値を割り当てたり、クラスのメソッドを呼び出したりできます。
' Set a property value.
sampleObject.SampleProperty = "Sample String"
' Call a method.
sampleObject.SampleMethod()
クラスのインスタンス化のプロセスでプロパティに値を割り当てるには、オブジェクト初期化子を使用します。
Dim sampleObject = New SampleClass With
{.FirstProperty = "A", .SecondProperty = "B"}
詳細については次を参照してください:
共有クラスおよびメンバー
クラスの共有メンバーは、クラスのすべてのインスタンスで共有されるプロパティ、プロシージャ、またはフィールドです。
共有メンバーを定義するコード例を次に示します。
Class SampleClass
Public Shared SampleString As String = "Sample String"
End Class
共有メンバーにアクセスするには、クラスのオブジェクトを作成せずにクラスの名前を使います。
MsgBox(SampleClass.SampleString)
Visual Basic の共有モジュールには共有メンバーだけが含まれ、これらをインスタンス化することはできません。 また、共有メンバーから、非共有のプロパティ、フィールド、またはメソッドにアクセスすることもできません。
詳細については次を参照してください:
匿名型
匿名型を使用すると、データ型のクラス定義を記述せずにオブジェクトを作成できます。 クラスは、コンパイラによって生成されます。 このクラスには使用可能な名前がなく、オブジェクトの宣言時に指定したプロパティが格納されます。
匿名型のインスタンスを作成するコード例を次に示します。
' sampleObject is an instance of a simple anonymous type.
Dim sampleObject =
New With {Key .FirstProperty = "A", .SecondProperty = "B"}
詳細については次を参照してください:匿名型。
継承
継承を使用すると、他のクラスで定義されている動作を再利用、拡張、および変更する新しいクラスを作成できます。 メンバーが継承される側のクラスを "基底クラス" と呼び、メンバーを継承する側のクラスを "派生クラス" と呼びます。 ただし、Visual Basic のすべてのクラスは、.NET のクラス階層構造をサポートしてすべてのクラスに下位レベルのサービスを提供する Object クラスを暗黙的に継承します。
Note
Visual Basic は多重継承をサポートしていません。 つまり、派生クラスに対して指定できる基底クラスは 1 つだけです。
基底クラスを継承するコード例を次に示します。
Class DerivedClass
Inherits BaseClass
End Class
既定では、すべてのクラスが継承可能になります。 ただし、クラスを基底クラスとして使用できないように指定したり、基底クラスとしてのみ使用できるクラスを作成したりできます。
クラスを基底クラスとして使用できないように指定する方法を次に示します。
NotInheritable Class SampleClass
End Class
クラスが基底クラスとしてのみ使用され、インスタンス化できないように指定する方法を次に示します。
MustInherit Class BaseClass
End Class
詳細については次を参照してください:
メンバーのオーバーライド
既定では、派生クラスは基底クラスのすべてのメンバーを継承します。 継承したメンバーの動作を変更する場合は、そのメンバーをオーバーライドする必要があります。 つまり、派生クラスに、メソッド、プロパティ、またはイベントの新しい実装を定義できます。
プロパティやメソッドのオーバーライド方法を制御するには、次の修飾子を使用します。
Visual Basic の修飾子 | 定義 |
---|---|
Overridable | 派生クラスでのクラス メンバーのオーバーライドを許可します。 |
Overrides | 基底クラスで定義されている仮想メンバー (オーバーライドできるメンバー) をオーバーライドします。 |
NotOverridable | 継承するクラスでのメンバーのオーバーライドを禁止します。 |
MustOverride | 派生クラスでのクラス メンバーのオーバーライドを必須にします。 |
Shadows | 基底クラスから継承されたメンバーを隠ぺいします。 |
インターフェイス
インターフェイスは、クラスと同様にプロパティ、メソッド、およびイベントのセットを定義します。 ただし、クラスとは異なり、インターフェイスは実装を提供しません。 インターフェイスはクラスによって実装され、クラスとは別のエンティティとして定義されます。 インターフェイスを実装するクラスは、そのインターフェイスのあらゆる機能を定義に従って厳密に実装する必要があります。この点で、インターフェイスはコントラクトを表しています。
インターフェイスを定義するコード例を次に示します。
Public Interface ISampleInterface
Sub DoSomething()
End Interface
クラスにインターフェイスを実装するコード例を次に示します。
Class SampleClass
Implements ISampleInterface
Sub DoSomething
' Method implementation.
End Sub
End Class
詳細については次を参照してください:
ジェネリック
.NET のクラス、構造体、インターフェイス、およびメソッドは、格納または使用できるオブジェクトの型を定義する "型パラメーター" を含むことができます。 ジェネリックの最も一般的な例として、コレクションがあります。コレクションには、その中に格納されるオブジェクトの型を指定できます。
ジェネリック クラスを定義するコード例を次に示します。
Class SampleGeneric(Of T)
Public Field As T
End Class
ジェネリック クラスのインスタンスを作成するコード例を次に示します。
Dim sampleObject As New SampleGeneric(Of String)
sampleObject.Field = "Sample string"
詳細については次を参照してください:
デリゲート
"デリゲート" は、メソッド シグネチャを定義する型であり、互換性のあるシグネチャを持つ任意のメソッドへの参照を提供できます。 メソッドは、デリゲートを使用して起動する (呼び出す) ことができます。 デリゲートは、他のメソッドへの引数としてメソッドを渡すために使用されます。
Note
イベント ハンドラーは、デリゲートを介して呼び出されるメソッドにすぎません。 デリゲートを使用したイベント処理について詳しくは、「イベント」をご覧ください。
デリゲートを作成するコード例を次に示します。
Delegate Sub SampleDelegate(ByVal str As String)
デリゲートで指定されたシグネチャに一致するメソッドへの参照を作成するコード例を次に示します。
Class SampleClass
' Method that matches the SampleDelegate signature.
Sub SampleSub(ByVal str As String)
' Add code here.
End Sub
' Method that instantiates the delegate.
Sub SampleDelegateSub()
Dim sd As SampleDelegate = AddressOf SampleSub
sd("Sample string")
End Sub
End Class
詳細については次を参照してください:
関連項目
.NET