インターフェイス (Visual Basic)
インターフェイスは、クラスが実装できるプロパティ、メソッド、およびイベントを定義します。 インターフェイスでは、密接に関連するプロパティ、メソッド、およびイベントの小さなグループとして機能を定義できます。これにより、既存のコードを損なうことなく、インターフェイスを拡張して実装を開発できるため、互換性の問題を減らすことができます。 追加のインターフェイスと実装を開発することで、いつでも新しい機能を追加できます。
クラスの継承の代わりにインターフェイスを使用する方が望ましい理由が、その他にもいくつかあります。
インターフェイスは、アプリケーションが特定の機能を提供するために関連性の低い多数のオブジェクトの種類を必要とする状況に、より適しています。
インターフェイスは、複数のインターフェイスを実装できる単一の実装を定義できるため、基底クラスよりも柔軟です。
インターフェイスは、基底クラスから実装を継承する必要がない状況に、より適しています。
インターフェイスは、クラスの継承を使用できない場合に便利です。 たとえば、構造体はクラスから継承できませんが、インターフェイスを実装できます。
インターフェイスの宣言
インターフェイスの定義は、Interface
ステートメントと End Interface
ステートメントで囲みます。 Interface
ステートメントの後に、オプションでInherits
ステートメントを追加して、継承されるインターフェイスを 1 つ以上指定することができます。 Inherits
ステートメントは、宣言内のコメントを除く他のすべてのステートメントより前に記述する必要があります。 インターフェイス定義の残りのステートメントは、Event
、Sub
、Function
、Property
、Interface
、Class
、Structure
、および Enum
ステートメントです。 インターフェイスには、End Sub
や End Property
など、実装コードや実装コードに関連付けられているステートメントを含めることはできません。
名前空間内で、インターフェイス ステートメントは既定では Friend
ですが、明示的に Public
または Friend
として宣言することもできます。 クラス、モジュール、インターフェイス、および構造体内で定義されたインターフェイスは、既定では Public
ですが、明示的に Public
、Friend
、Protected
、または Private
として宣言することもできます。
Note
Shadows
キーワードは、すべてのインターフェイス メンバーに適用できます。 Overloads
キーワードは、インターフェイス定義で宣言された Sub
、Function
、および Property
ステートメントに適用できます。 さらに、Property
ステートメントには Default
、ReadOnly
、または WriteOnly
修飾子を付けることができます。 他の修飾子 (Public
、Private
、Friend
、Protected
、Shared
、Overrides
、MustOverride
、または 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
実装するメンバーのパラメーターの型と戻り値の型は、インターフェイスのインターフェイス プロパティまたはメンバー宣言と一致する必要があります。 インターフェイスの要素を実装する最も一般的な方法は、前の例で示されているように、インターフェイスと同じ名前を持つメンバーを使用する方法です。
インターフェイス メソッドの実装を宣言するには、インスタンス メソッドの宣言で有効な任意の属性を使用できます。たとえば、Overloads
、Overrides
、Overridable
、Public
、Private
、Protected
、Friend
、Protected Friend
、MustOverride
、Default
、Static
などです。 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 プロパティを使用して、readonly プロパティを実装できます (つまり、実装するクラスで readonly を宣言する必要はありません)。 インターフェイスを実装する場合、少なくともインターフェイスが宣言しているメンバーを実装することになりますが、プロパティを書き込み可能にするなど、追加の機能を提供することもできます。
関連トピック
Title | 説明 |
---|---|
チュートリアル: インターフェイスの作成と実装 | 独自のインターフェイスを定義および実装する処理の詳細な手順を説明します。 |
ジェネリック インターフェイスの分散 | ジェネリック インターフェイスでの共変性と反変性について説明し、.NET Framework でのバリアント ジェネリック インターフェイスの一覧を示します。 |