Share via


オブジェクト指向プログラミング (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 のデストラクターおよびガベージ コレクションの詳細については、「ガベージ コレクション」をご覧ください。

イベント

クラスやオブジェクトは、何か重要なことが起こった場合に、イベントを使用して他のクラスまたはオブジェクトに通知を送ります。 イベントを送信する (発生させる) クラスは "パブリッシャー" と呼ばれ、イベントを受信する (処理する) クラスは "サブスクライバー" と呼ばれます。 イベント、およびイベントの発生と処理の詳細については、「イベント」をご覧ください。

入れ子になったクラス

別のクラス内で定義されているクラスを "入れ子になったクラス" と呼びます。 既定では、入れ子になったクラスはプライベートです。

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

詳細については次を参照してください:

関連項目