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

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

クラス継承ではなくインターフェイスを使用する理由は他にもあります。

  • インターフェイスは、特定の機能を提供するために、関連性のない多数のオブジェクト型がアプリケーションで必要な場合に適しています。

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

  • インターフェイスは基本クラスから実装を継承する必要のない場合に適しています。

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

インターフェイスの宣言

インターフェイス定義は、Interface と End Interface ステートメントで囲まれます。Interface ステートメントの後には、1 つ以上の継承インターフェイスの一覧を示す Inherits ステートメント (省略可能) を追加できます。Inherits ステートメントは、宣言内でコメント以外の他のすべてのステートメントよりも前にある必要があります。インターフェイス定義に使用するその他のステートメントは、Event、Sub、Function、Property、Interface、Class、Structure、および Enum ステートメントです。インターフェイスには、実装コードまたは実装コードに関連付けられた End Sub や End Property などのステートメントを含めることはできません。

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

[!メモ]

Shadows キーワードは、すべてのインターフェイス メンバーに対して使用できます。Overloads キーワードは、インターフェイス定義に宣言された Sub、Function、および Property のステートメントに使用できます。また、Property ステートメントには Default、ReadOnly、または WriteOnly の修飾子を指定できます。その他の修飾子 (Public、Private、Friend、Protected、Shared、Overrides、MustOverride、または Overridable) は許可されません。詳細については、「宣言コンテキストと既定のアクセス レベル (Visual Basic)」を参照してください。

たとえば、次のコードでは、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 キーワードは、クラス メンバーまたは構造体メンバーによって、特定のインターフェイス メンバーが実装されていることを表します。

28e2e18x.collapse_all(ja-jp,VS.110).gifImplements ステートメント

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

28e2e18x.collapse_all(ja-jp,VS.110).gifImplements キーワード

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

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

インターフェイス メソッドの実装を宣言するために、Overloads、Overrides、Overridable、Public、Private、Protected、Friend、Protected Friend、MustOverride、Default、および Static などのインスタンス メソッド宣言に対して有効な属性を使用できます。Shared 属性はインスタンス メソッドではなくクラスを定義するため、使用できません。

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

Class Class2
    Implements I1, I2

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

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

28e2e18x.collapse_all(ja-jp,VS.110).gifインターフェイスの実装例

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

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

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

関連トピック

Title

Description

チュートリアル: インターフェイスの作成と実装 (Visual Basic)

独自のインターフェイスを定義および実装するプロセスの詳細な手順を示します。

ジェネリック インターフェイスの分散 (C# および Visual Basic)

ジェネリック インターフェイスの共変性と反変性について説明し、.NET Framework のバリアント ジェネリック インターフェイスの一覧を示します。