Interface ステートメント (Visual Basic)

更新 : 2007 年 11 月

インターフェイスの名前を宣言し、インターフェイスに含まれるメンバの定義を開始します。

[ <attributelist> ] [ accessmodifier ] [ Shadows ] _
Interface name [ ( Of typelist ) ]
    [ Inherits interfacenames ]
    [ [ modifiers ] Property membername ]
    [ [ modifiers ] Function membername ]
    [ [ modifiers ] Sub membername ]
    [ [ modifiers ] Event membername ]
    [ [ modifiers ] Interface membername ]
    [ [ modifiers ] Class membername ]
    [ [ modifiers ] Structure membername ]
End Interface

指定項目

  • attributelist
    省略可能です。「属性リスト」を参照してください。

  • accessmodifier
    省略可能です。次のいずれかを指定できます。

    Visual Basic でのアクセス レベル を参照してください。

  • Shadows
    省略可能です。「Shadows」を参照してください。

  • name
    必ず指定します。このインターフェイスの名前です。宣言された要素の名前 を参照してください。

  • Of
    省略可能です。ジェネリック インターフェイスであることを指定します。

  • typelist
    Of キーワードを使用する場合は必ず指定します。このインターフェイスの型パラメータのリストを指定します。「型リスト」を参照してください。

  • Inherits
    省略可能です。このインターフェイスが別のインターフェイスの属性およびメンバを継承することを指定します。Inherits ステートメント を参照してください。

  • interfacenames
    Inherits ステートメントを使用する場合は必ず指定します。このインターフェイスの派生元のインターフェイスの名前を指定します。

  • modifiers
    省略可能です。定義するインターフェイス メンバに適した修飾子を指定します。

  • Property
    省略可能です。インターフェイスのメンバであるプロパティを定義します。

  • Function
    省略可能です。インターフェイスのメンバである Function プロシージャを定義します。

  • Sub
    省略可能です。インターフェイスのメンバである Sub プロシージャを定義します。

  • Event
    省略可能です。インターフェイスのメンバであるイベントを定義します。

  • Interface
    省略可能です。このインターフェイスの内部に入れ子になったインターフェイスを定義します。入れ子になったインターフェイスの定義は、End Interface ステートメントで終了する必要があります。

  • Class
    省略可能です。インターフェイスのメンバであるクラスを定義します。このクラスの定義は、End Class ステートメントで終了する必要があります。

  • Structure
    省略可能です。インターフェイスのメンバである構造体を定義します。このメンバの構造体の定義は、End Structure ステートメントで終了する必要があります。

  • membername
    インターフェイスのメンバとして定義したプロパティ、プロシージャ、イベント、インターフェイス、クラスまたは構造体のそれぞれに必ず指定します。メンバの名前です。

  • End Interface
    Interface の定義を終了します。

解説

インターフェイスにはプロパティやプロシージャなど、クラスや構造体で実装可能なメンバをまとめて定義します。インターフェイスにはメンバのシグネチャだけを定義し、内部の処理は定義しません。

クラスや構造体でインターフェイスを実装する場合は、そのインターフェイスに定義されたすべてのメンバのコードを定義します。最後に、アプリケーションがそのクラスまたは構造体からインスタンスを作成した時点でオブジェクトが存在し、メモリ内で実行されます。詳細については、「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)」の「有効期間」を参照してください。

使用例

次の例は Interface ステートメントを使用して、thisInterface という名前のインターフェイスを定義します。これを実装するには、Property ステートメントと Function ステートメントを使用する必要があります。

Public Interface thisInterface
    Property thisProp(ByVal thisStr As String) As Char
    Function thisFunc(ByVal thisInt As Integer) As Integer
End Interface

インターフェイス内で Property ステートメントと Function ステートメントで開始されたブロックが、End Property と End Function で終了していない点に注意してください。インターフェイスには、そのメンバのシグネチャのみを定義します。Property ブロックと Function ブロックの完全な定義は、thisInterface を実装するクラスに記述されています。

参照

概念

Visual Basic におけるジェネリック型

参照

Class ステートメント (Visual Basic)

Module ステートメント

Structure ステートメント

Property ステートメント

Function ステートメント (Visual Basic)

Sub ステートメント (Visual Basic)

その他の技術情報

Visual Basic におけるインターフェイス