次の方法で共有


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

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

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

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

  • インターフェイスは、複数のインターフェイスを実装できる 1 つの実装を定義できるため、基底クラスよりも柔軟性が高くなります。

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

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

インターフェイスの宣言

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

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

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 つ以上のインターフェイスを実装する場合は、Classステートメントまたは Structure ステートメントの直後に Implements ステートメントを含める必要があります。 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 つ目のインターフェイス 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

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

タイトル 説明
チュートリアル: インターフェイスの作成と実装 独自のインターフェイスを定義して実装するプロセスについて詳しく説明します。
ジェネリック インターフェイスの分散 ジェネリック インターフェイスの共変性と反変性について説明し、.NET Framework のバリアント ジェネリック インターフェイスの一覧を提供します。