インターフェイス (Visual Basic)

インターフェイスは、クラスが実装できるプロパティ、メソッド、およびイベントを定義します。 インターフェイスでは、密接に関連するプロパティ、メソッド、およびイベントの小さなグループとして機能を定義できます。これにより、既存のコードを損なうことなく、インターフェイスを拡張して実装を開発できるため、互換性の問題を減らすことができます。 追加のインターフェイスと実装を開発することで、いつでも新しい機能を追加できます。

クラスの継承の代わりにインターフェイスを使用する方が望ましい理由が、その他にもいくつかあります。

  • インターフェイスは、アプリケーションが特定の機能を提供するために関連性の低い多数のオブジェクトの種類を必要とする状況に、より適しています。

  • インターフェイスは、複数のインターフェイスを実装できる単一の実装を定義できるため、基底クラスよりも柔軟です。

  • インターフェイスは、基底クラスから実装を継承する必要がない状況に、より適しています。

  • インターフェイスは、クラスの継承を使用できない場合に便利です。 たとえば、構造体はクラスから継承できませんが、インターフェイスを実装できます。

インターフェイスの宣言

インターフェイスの定義は、Interface ステートメントと End Interface ステートメントで囲みます。 Interface ステートメントの後に、オプションでInherits ステートメントを追加して、継承されるインターフェイスを 1 つ以上指定することができます。 Inherits ステートメントは、宣言内のコメントを除く他のすべてのステートメントより前に記述する必要があります。 インターフェイス定義の残りのステートメントは、EventSubFunctionPropertyInterfaceClassStructure、および Enum ステートメントです。 インターフェイスには、End SubEnd Property など、実装コードや実装コードに関連付けられているステートメントを含めることはできません。

名前空間内で、インターフェイス ステートメントは既定では Friend ですが、明示的に Public または Friend として宣言することもできます。 クラス、モジュール、インターフェイス、および構造体内で定義されたインターフェイスは、既定では Public ですが、明示的に PublicFriendProtected、または Private として宣言することもできます。

Note

Shadows キーワードは、すべてのインターフェイス メンバーに適用できます。 Overloads キーワードは、インターフェイス定義で宣言された SubFunction、および Property ステートメントに適用できます。 さらに、Property ステートメントには DefaultReadOnly、または WriteOnly 修飾子を付けることができます。 他の修飾子 (PublicPrivateFriendProtectedSharedOverridesMustOverride、または Overridable) は許可されていません。 詳細については、「宣言コンテキストと既定のアクセス レベル」を参照してください。

たとえば、次のコードは、1 つの関数、1 つのプロパティ、および 1 つのイベントを持つインターフェイスを定義します。

Interface IAsset
    Event ComittedChange(ByVal Success As Boolean)
    Property Division() As String
    Function GetID() As Integer
End Interface

インターフェイスの実装

Visual Basic では、予約語 Implements が 2 つの方法で使用されます。 Implements ステートメントは、クラスまたは構造体がインターフェイスを実装することを示します。 Implements キーワードは、クラス メンバーまたは構造体メンバーが特定のインターフェイス メンバーを実装することを示します。

Implements ステートメント

クラスまたは構造体が 1 つ以上のインターフェイスを実装する場合は、Implements ステートメントを Class または Structure ステートメントの直後に記述する必要があります。 Implements ステートメントには、クラスによって実装されるインターフェイスのコンマ区切りのリストが必要です。 クラスまたは構造体は、すべてのインターフェイス メンバーを Implements キーワードを使用して実装する必要があります。

Implements キーワード

Implements キーワードには、実装されるインターフェイス メンバーのコンマ区切りのリストが必要です。 一般的には、1 つのインターフェイス メンバーのみが指定されますが、複数のメンバーを指定することもできます。 インターフェイス メンバーの指定は、クラス内の implements ステートメントで指定する必要があるインターフェイス名と、ピリオドと、実装されるメンバー関数、プロパティ、またはイベントの名前で構成されます。 インターフェイス メンバーを実装するメンバーの名前には、有効な任意の識別子を使用できます。また、Visual Basic の以前のバージョンで使用されている InterfaceName_MethodName 規則の制限を受けません。

たとえば、次のコードは、インターフェイスのメソッドを実装する Sub1 という名前のサブルーチンを宣言する方法を示しています。

Class Class1
    Implements interfaceclass.interface2

    Sub Sub1(ByVal i As Integer) Implements interfaceclass.interface2.Sub1
    End Sub
End Class

実装するメンバーのパラメーターの型と戻り値の型は、インターフェイスのインターフェイス プロパティまたはメンバー宣言と一致する必要があります。 インターフェイスの要素を実装する最も一般的な方法は、前の例で示されているように、インターフェイスと同じ名前を持つメンバーを使用する方法です。

インターフェイス メソッドの実装を宣言するには、インスタンス メソッドの宣言で有効な任意の属性を使用できます。たとえば、OverloadsOverridesOverridablePublicPrivateProtectedFriendProtected FriendMustOverrideDefaultStatic などです。 Shared 属性は、インスタンス メソッドではなくクラスを定義するため、無効です。

Implements を使用すると、次の例のように、インターフェイスで定義されている複数のメソッドを実装する 1 つのメソッドを記述することもできます。

Class Class2
    Implements I1, I2

    Protected Sub M1() Implements I1.M1, I1.M2, I2.M3, I2.M4
    End Sub
End Class

インターフェイス メンバーを実装するには、プライベート メンバーを使用することができます。 プライベート メンバーでインターフェイスのメンバーを実装すると、そのメンバーは、クラスのオブジェクト変数で直接利用できない場合でも、インターフェイスを通じて利用できるようになります。

インターフェイスの実装の例

インターフェイスを実装するクラスは、そのすべてのプロパティ、メソッド、およびイベントを実装する必要があります。

次の例では、2 つのインターフェイスが定義されます。 2 番目のインターフェイス Interface2Interface1 を継承し、追加のプロパティとメソッドを定義します。

Interface Interface1
    Sub sub1(ByVal i As Integer)
End Interface

' Demonstrates interface inheritance.
Interface Interface2
    Inherits Interface1
    Sub M1(ByVal y As Integer)
    ReadOnly Property Num() As Integer
End Interface

次の例は、前の例で定義されたインターフェイスである Interface1 を実装します。

Public Class ImplementationClass1
    Implements Interface1
    Sub Sub1(ByVal i As Integer) Implements Interface1.sub1
        ' Insert code here to implement this method.
    End Sub
End Class

最後の例は、Interface1 から継承されたメソッドを含めて、Interface2 を実装します。

Public Class ImplementationClass2
    Implements Interface2
    Dim INum As Integer = 0
    Sub sub1(ByVal i As Integer) Implements Interface2.sub1
        ' Insert code here that implements this method.
    End Sub
    Sub M1(ByVal x As Integer) Implements Interface2.M1
        ' Insert code here to implement this method.
    End Sub

    ReadOnly Property Num() As Integer Implements Interface2.Num
        Get
            Num = INum
        End Get
    End Property
End Class

readwrite プロパティを使用して、readonly プロパティを実装できます (つまり、実装するクラスで readonly を宣言する必要はありません)。 インターフェイスを実装する場合、少なくともインターフェイスが宣言しているメンバーを実装することになりますが、プロパティを書き込み可能にするなど、追加の機能を提供することもできます。

Title 説明
チュートリアル: インターフェイスの作成と実装 独自のインターフェイスを定義および実装する処理の詳細な手順を説明します。
ジェネリック インターフェイスの分散 ジェネリック インターフェイスでの共変性と反変性について説明し、.NET Framework でのバリアント ジェネリック インターフェイスの一覧を示します。