インターフェイス は、クラスが実装できるプロパティ、メソッド、およびイベントを定義します。 インターフェイスを使用すると、密接に関連するプロパティ、メソッド、およびイベントの小さなグループとして機能を定義できます。これにより、既存のコードを危険にさらすことなく、インターフェイスの拡張実装を開発できるため、互換性の問題が軽減されます。 追加のインターフェイスと実装を開発することで、いつでも新しい機能を追加できます。
クラス継承の代わりにインターフェイスを使用する理由は、他にもいくつかあります。
インターフェイスは、アプリケーションが特定の機能を提供するために、関係のない多くのオブジェクト型を必要とする状況に適しています。
インターフェイスは、複数のインターフェイスを実装できる 1 つの実装を定義できるため、基底クラスよりも柔軟性が高くなります。
インターフェイスは、基底クラスから実装を継承する必要がない場合に適しています。
インターフェイスは、クラス継承を使用できない場合に便利です。 たとえば、構造体はクラスから継承することはできませんが、インターフェイスを実装できます。
インターフェイスの宣言
インターフェイス定義は、 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
) は使用できません。 詳細については、「 宣言コンテキストと既定のアクセス レベル」を参照してください。
たとえば、次のコードは、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
実装するメンバーのパラメーター型と戻り値の型は、インターフェイスのインターフェイス プロパティまたはメンバー宣言と一致する必要があります。 インターフェイスの要素を実装する最も一般的な方法は、前の例に示すように、インターフェイスと同じ名前を持つメンバーを使用することです。
インターフェイス メソッドの実装を宣言するには、インスタンス メソッド宣言で有効な属性 ( 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 プロパティを使用して読み取り専用プロパティを実装できます (つまり、実装クラスで読み取り専用で宣言する必要はありません)。 インターフェイスを実装すると、少なくともインターフェイスが宣言するメンバーを実装することが約束されますが、プロパティを書き込み可能にするなど、より多くの機能を提供できます。
関連トピック
タイトル | 説明 |
---|---|
チュートリアル: インターフェイスの作成と実装 | 独自のインターフェイスを定義して実装するプロセスについて詳しく説明します。 |
ジェネリック インターフェイスの分散 | ジェネリック インターフェイスの共変性と反変性について説明し、.NET Framework のバリアント ジェネリック インターフェイスの一覧を提供します。 |
.NET