Implementa a instrução

Especifica uma interface ou classe que será implementada no módulo de classe no qual ele aparece.

Sintaxe

Implementa [ Classe InterfaceName | ]

O InterfaceName ou Classe necessário é o nome de uma interface ou classe em uma biblioteca de tipos cujos métodos serão implementados pelos métodos correspondentes na classe Visual Basic.

Comentários

Uma interface é uma coleção de protótipos que representa os membros (métodos e propriedades) que a interface encapsula; ou seja, ela contém apenas as declarações para os procedimentos de membro. Uma classe fornece uma implementação de todos os métodos e propriedades de uma ou mais interfaces. As classes fornecem o código usado quando cada função é chamada por um controlador da classe. Todas as classes implementam pelo menos uma interface, que é considerada a interface padrão da classe. No Visual Basic, qualquer membro que não seja explicitamente membro de uma interface implementada é implicitamente um membro da interface padrão.

Quando uma classe visual basic implementa uma interface, a classe Visual Basic fornece suas próprias versões de todos os procedimentos públicos especificados na biblioteca de tipos da Interface. Além de fornecer um mapeamento entre os protótipos de interface e seus procedimentos, a instrução Implements faz com que a classe aceite chamadas COM QueryInterface para a ID de interface especificada.

Observação

O Visual Basic não implementa classes ou interfaces derivadas.

Ao implementar uma interface ou classe, você deve incluir todos os procedimentos públicos envolvidos. Um membro ausente em uma implementação de uma interface ou classe causa um erro. Se você não colocar código em um dos procedimentos em uma classe que está implementando, poderá gerar o erro apropriado (Const E_NOTIMPL = &H80004001) para que um usuário da implementação entenda que um membro não foi implementado.

A instrução Implements não pode ser exibida em um módulo padrão.

Exemplo

O exemplo a seguir mostra como usar a instrução Implements para disponibilizar um conjunto de declarações para várias classes. Ao compartilhar as declarações por meio da instrução Implements , nenhuma das classes precisa fazer declarações em si. O exemplo também mostra como o uso de uma interface permite a abstração: uma variável de tipo forte pode ser declarada usando o tipo de interface. Em seguida, ele pode ser atribuído objetos de diferentes tipos de classe que implementam a interface.

Suponha que haja dois formulários, SelectorForm e DataEntryForm. O formulário seletor tem dois botões, Dados do Cliente e Dados do Fornecedor. Para inserir informações de nome e endereço para um cliente ou um fornecedor, o usuário clica no botão cliente ou no botão fornecedor no formulário seletor e insere o nome e o endereço usando o formulário de entrada de dados. O formulário de entrada de dados tem dois campos de texto, Nome e Endereço.

O código a seguir para as declarações de interface está em uma classe chamada PersonalData:

Public Name As String 
Public Address As String 

O código que dá suporte aos dados do cliente está em um módulo de classe chamado Cliente. Observe que a interface PersonalData é implementada com membros nomeados com o nome PersonalData_ da interface como prefixo.

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

O código que dá suporte aos dados do fornecedor está em um módulo de classe chamado Fornecedor:

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


O código a seguir dá suporte ao formulário Seletor :

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

O código a seguir dá suporte ao formulário de Entrada de Dados :

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

Observe como, no formulário de entrada de dados, a variável m_pd é declarada usando a interface PersonalData e pode ser atribuída objetos da classe Cliente ou Fornecedor porque ambas as classes implementam a interface PersonalData.

Observe também que a variável m_pd só pode acessar os membros da interface PersonalData. Se um objeto Customer for atribuído a ele, o CustomerAgentId membro específico do cliente não estará disponível. Da mesma forma, se um objeto Supplier for atribuído a ele, o membro específico do fornecedor NumberOfProductLines não estará disponível. Atribuir um objeto a variáveis declaradas usando interfaces diferentes fornece um comportamento polimórfico.

Observe também que as classes Cliente e Fornecedor , conforme definido anteriormente, não expõem os membros da interface PersonalData. A única maneira de acessar os membros PersonalData é atribuir um objeto Cliente ou Fornecedor a uma variável declarada como PersonalData. Se um comportamento semelhante à herança for desejado, com a classe Cliente ou Fornecedor expondo os membros PersonalData, os membros públicos devem ser adicionados à classe. Elas podem ser implementadas delegando para as implementações da interface PersonalData.

Por exemplo, a classe Cliente pode ser estendida com o seguinte:

'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

Confira também

Suporte e comentários

Tem dúvidas ou quer enviar comentários sobre o VBA para Office ou sobre esta documentação? Confira Suporte e comentários sobre o VBA para Office a fim de obter orientação sobre as maneiras pelas quais você pode receber suporte e fornecer comentários.