ステートメントを実装する

それが出現するクラス モジュールに実装されるインターフェイスまたはクラスを指定します。

構文

実装 [InterfaceName | クラス ]

必須の InterfaceName または Class は、タイプ ライブラリ内のインターフェイスまたはクラスの名前であり、そのインターフェイスまたはクラスのメソッドが Visual Basic クラスの対応するメソッドによって実装されます。

注釈

インターフェイスは、 インターフェイス がカプセル化するメンバー (メソッドとプロパティ) を表すプロトタイプのコレクションです。つまり、メンバー プロシージャの宣言のみが含まれます。 クラスは、1 つ以上のインターフェイスのすべてのメソッドとプロパティの実装を提供します。 クラスは、 クラスのコントローラーによって各関数が呼び出されるときに使用されるコードを提供します。 すべてのクラスは、少なくとも 1 つのインターフェイスを実装します。これは、クラスの既定のインターフェイスと見なされます。 Visual Basic では、実装されたインターフェイスのメンバーではないメンバーは、暗黙的に既定のインターフェイスのメンバーになります。

Visual Basic クラスがインターフェイスを実装する場合、Visual Basic クラスはインターフェイスのタイプ ライブラリで指定されたすべての Publicプロシージャ の独自のバージョンを提供します。 Implements ステートメントは、インターフェイスのプロトタイプとプロシージャの間のマッピングを提供するだけでなく、指定したインターフェイス ID の COM QueryInterface 呼び出しをクラスが受け入れられるようにします。

注:

Visual Basic は、派生クラスまたは派生インターフェイスを実装しません。

インターフェイスまたはクラスを実装するときは、関係するすべての Public プロシージャを実装する必要があります。 インターフェイスまたはクラスの実装に不足しているメンバーがあると、エラーが発生します。 実装するクラス内のプロシージャにコードを記述しない場合は、適切なエラー (Const E_NOTIMPL = &H80004001) を発生させることができるため、実装のユーザーはメンバーが実装されていないことがわかります。

Implements ステートメントは標準モジュールでは使用できません。

以下の例では、Implements ステートメントを使って、複数のクラスで利用可能な宣言のセットを作成する方法を説明します。 Implements ステートメントで宣言を共有することによって、どのクラスもそれ自体で宣言を作成する必要はありません。 この例では、インターフェイスを使用して抽象化を可能にする方法も示しています。厳密に型の変数をインターフェイス型を使用して宣言できます。 そうすると、インターフェイスを実装する別のクラス型のオブジェクトを割り当てることができます。

SelectorForm と DataEntryForm の 2 つのフォームがあるとします。 セレクター フォームには、 顧客データサプライヤー データの 2 つのボタンがあります。 顧客またはサプライヤーの名前と住所の情報を入力するには、ユーザーがセレクター フォームの顧客ボタンまたはサプライヤー ボタンをクリックし、データ入力フォームを使用して名前と住所を入力します。 [データ入力] フォームには、[名前][住所] という 2 つのテキスト フィールドがあります。

インターフェイス宣言の次のコードは、 PersonalData というクラスにあります。

Public Name As String 
Public Address As String 

顧客データをサポートするコードは、 Customer というクラス モジュールにあります。 PersonalData インターフェイスは、インターフェイス名 PersonalData_ をプレフィックスとして指定したメンバーで実装されることに注意してください。

Implements PersonalData

'For PersonalData implementation
Private m_name As String
Private m_address As String

'Customer specific
Public CustomerAgentId As Long

'PersonalData implementation
Private Property Let PersonalData_Name(ByVal RHS As String)
    m_name = RHS
End Property
 
Private Property Get PersonalData_Name() As String
    PersonalData_Name = m_name
End Property


Private Property Let PersonalData_Address(ByVal RHS As String)
    m_address = RHS
End Property

Private Property Get PersonalData_Address() As String
    PersonalData_Address = m_address
End Property


'nitialize members
Private Sub Class_Initialize()
    m_name = "[customer name]"
    m_address = "[customer address]"
    CustomerAgentID = 0
End Sub

サプライヤー データをサポートするコードは、 Supplier というクラス モジュールにあります。

Implements PersonalData

'for PersonalData implementation
Private m_name As String
Private m_address As String

'Supplier specific
Public NumberOfProductLines As Long


'PersonalData implementation
Private Property Let PersonalData_Name(ByVal RHS As String)
    m_name = RHS
End Property
 Private Property Get PersonalData_Name() As String
    PersonalData_Name = m_name
End Property


Private Property Let PersonalData_Address(ByVal RHS As String)
    m_address = RHS
End Property

Private Property Get PersonalData_Address() As String
    PersonalData_Address = m_address
End Property


'initialize members
Private Sub Class_Initialize()
    m_name = "[supplier name]"
    m_address = "[supplier address]"
    NumberOfProductLines = 15
End Sub


次のコードは 、セレクター フォームをサポートしています。

Private cust As New Customer 
Private sup As New Supplier 
 
Private Sub Customer_Click() 
Dim frm As New DataEntryForm 
 Set frm.PD = cust 
 frm.Show 1 
End Sub 
 
Private Sub Supplier_Click() 
Dim frm As New DataEntryForm
 Set frm.PD = sup 
 frm.Show 1 
End Sub

次のコードは、 データ入力 フォームをサポートしています。

Private m_pd As PersonalData

Private Sub SetTextFields()
    With m_pd
        Text1 = .Name
        Text2 = .Address
    End With
End Sub

Public Property Set PD(Data As PersonalData) 
    Set m_pd = Data
    SetTextFields
End Property

Private Sub Text1_Change()
    m_pd.Name = Text1.Text
End Sub

Private Sub Text2_Change()
    m_pd.Address = Text2.Text
End Sub

データ入力フォームでは、 m_pd 変数が PersonalData インターフェイスを使用して宣言され、両方のクラスが PersonalData インターフェイスを実装するため、 Customer クラスまたは Supplier クラスのオブジェクトを割り当てることができることに注意してください。

また、 m_pd 変数は PersonalData インターフェイスのメンバーにのみアクセスできることに注意してください。 Customer オブジェクトが割り当てられている場合、Customer 固有のメンバー CustomerAgentId は使用できません。 同様に、 Supplier オブジェクトが割り当てられている場合、サプライヤー固有のメンバー NumberOfProductLines は使用できません。 異なるインターフェイスを使用して宣言された変数にオブジェクトを割り当てると、ポリモーフィックな動作が提供されます。

また、前に定義した Customer クラスと Supplier クラスでは、PersonalData インターフェイスのメンバーは公開されません。 PersonalData メンバーにアクセスする唯一の方法は、 Customer オブジェクトまたは Supplier オブジェクトを PersonalData として宣言された変数に割り当てることです。 継承に似た動作が必要な場合は、 Customer クラスまたは Supplier クラスで PersonalData メンバーが公開されている場合は、パブリック メンバーを クラスに追加する必要があります。 PersonalData インターフェイスの実装に委任することで、これらを実装できます。

たとえば、 Customer クラスは次のように拡張できます。

'emulate PersonalData inheritance
Public Property Let Name(ByVal RHS As String)
    PersonalData_Name = RHS
End Property

Public Property Get Name() As String
    Name = PersonalData_Name
End Property

Public Property Let Address(ByVal RHS As String)
    PersonalData_Address = RHS
End Property

Public Property Get Address() As String
    Address = PersonalData_Address
End Property

関連項目

サポートとフィードバック

Office VBA またはこの説明書に関するご質問やフィードバックがありますか? サポートの受け方およびフィードバックをお寄せいただく方法のガイダンスについては、Office VBA のサポートおよびフィードバックを参照してください。