インターフェイスにはプロパティやプロシージャなど、クラスや構造体で実装可能なメンバをまとめて定義します。インターフェイスにはメンバのシグネチャだけを定義し、内部の処理は定義しません。
クラスや構造体でインターフェイスを実装する場合は、そのインターフェイスに定義されたすべてのメンバのコードを定義します。最後に、アプリケーションがそのクラスまたは構造体からインスタンスを作成した時点でオブジェクトが存在し、メモリ内で実行されます。詳細については、「Visual Basic におけるオブジェクト指向プログラミング」および「Visual Basic におけるインターフェイス」を参照してください。
インターフェイスとクラスの比較については、「インターフェイスの概要」を参照してください。
Interface は、名前空間またはモジュール レベルでのみ使用できます。つまり、インターフェイスの宣言コンテキストはソース ファイル、名前空間、クラス、構造体、モジュール、またはインターフェイスのいずれかである必要があり、プロシージャまたはブロックでは宣言できません。詳細については、「宣言コンテキストと既定のアクセス レベル」を参照してください。
インターフェイスには既定で Friend (Visual Basic) のアクセス レベルが設定されます。アクセス修飾子を使用してこれらのアクセス レベルを調整できます。詳細については、「Visual Basic でのアクセス レベル」を参照してください。
規則
-
インターフェイスの入れ子インターフェイスを別のインターフェイスの内部に定義できます。外側のインターフェイスを包含インターフェイスと呼び、内側のインターフェイスを入れ子になったインターフェイスと呼びます。
-
メンバの宣言プロパティまたはプロシージャをインターフェイスのメンバとして宣言する場合は、そのシグネチャだけを定義します。シグネチャには要素の種類 (プロパティまたはプロシージャ)、パラメータとその型、および戻り値の型が含まれます。このため、メンバの定義にはコードを 1 行だけ使用し、End Function や End Property などの終了ステートメントをインターフェイスに定義することはできません。
これに対し、列挙体や構造体、または入れ子になったクラスやインターフェイスを定義するときには、そのデータ メンバを含める必要があります。
-
メンバ修飾子モジュールのメンバを定義するときには、アクセス修飾子を使用できません。また、Overloads を除くどのプロシージャ修飾子 (Shared (Visual Basic)など) も指定できません。どのメンバでも、Shadows を使って宣言できます。また、プロパティを定義するときには、ReadOnly (Visual Basic) や WriteOnly の他に Default (Visual Basic) を使用できます。
-
継承インターフェイスに Inherits ステートメント を使用して、1 つ以上の基本インターフェイスを指定できます。2 つのインターフェイスに同じ名前のメンバが定義されている場合でも、その 2 つを継承できます。その場合は、実装先のコードで名前を修飾して、どちらのメンバを実装しているのか指定する必要があります。
インターフェイスはより制限の高いアクセス レベルを持つ別のインターフェイスは継承できません。たとえば、Public インターフェイスは Friend インターフェイスを継承できません。
インターフェイスは、自分の中に入れ子になっているインターフェイスを継承できません。
-
実装クラスに Implements (Visual Basic) ステートメントを使ってインターフェイスを実装するときには、そのインターフェイスに定義されているすべてのメンバを実装する必要があります。さらに、実装先のコードでは、各シグネチャがインターフェイスに定義された対応するシグネチャと完全に一致していることが必要です。ただし、実装先のコードでのメンバの名前は、インターフェイスに定義されたメンバ名と同じでなくてもかまいません。
クラスにプロシージャを実装するとき、そのプロシージャに Shared を指定できません。
-
既定のプロパティ。インターフェイスには、1 つまでのプロパティを既定のプロパティとして指定できます。既定のプロパティは、プロパティ名を使用せずに参照できます。既定のプロパティを指定するには、Default (Visual Basic) 修飾子を使って宣言します。詳細については、「既定のプロパティ」を参照してください。
つまり、インターフェイスに既定のプロパティを定義できるのは、インターフェイスが何も継承していない場合だけです。
動作
-
アクセス レベルすべてのインターフェイス メンバは、暗黙的に Public (Visual Basic) アクセスになります。メンバを定義するとき、アクセス修飾子は使用できません。ただし、インターフェイスを実装するクラスで、実装された各メンバに対してアクセス レベルを宣言できます。
クラスのインスタンスを変数に割り当てる場合、そのメンバのアクセス レベルは、変数のデータ型が基のインターフェイスかそれとも実装先のクラスかによって変わります。次に例を示します。
Public Interface IDemo
Sub doSomething()
End Interface
Public Class implementIDemo
Implements IDemo
Private Sub doSomething() Implements IDemo.doSomething
End Sub
End Class
Dim varAsInterface As IDemo = New implementIDemo()
Dim varAsClass As implementIDemo = New implementIDemo()
varAsInterface を指定してクラス メンバにアクセスする場合は、すべてのメンバがパブリック アクセスになります。ただし、varAsClass を指定してメンバにアクセスする場合、Sub プロシージャである doSomething はプライベート アクセスになります。
-
スコープインターフェイスのスコープは名前空間、クラス、構造体、またはモジュール全体です。
インターフェイスのすべてのメンバのスコープは、インターフェイス全体になります。
-
有効期間インターフェイスおよびそのメンバには、有効期間がありません。クラスがインターフェイスを実装し、そのクラスのインスタンスとしてオブジェクトが作成されると、そのオブジェクトが有効期間 (オブジェクトを実行しているアプリケーションが終了するまで) を持ちます。詳細については、「Class ステートメント (Visual Basic)」の「有効期間」を参照してください。