Partilhar via


Implementa a instrução

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

Sintaxe

Implementa [ InterfaceName | Class ]

O InterfaceName ou Classe necessário é o nome de uma interface ou classe numa 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 representam os membros (métodos e propriedades) que a interface encapsula; ou seja, contém apenas as declarações para os procedimentos dos membros. Uma classe fornece uma implementação de todos os métodos e propriedades de uma ou mais interfaces. As classes fornecem o código utilizado quando cada função é chamada por um controlador da classe . Todas as classes implementam, pelo menos, uma interface, que é considerada a interface predefinida da classe . No Visual Basic, qualquer membro que não seja explicitamente membro de uma interface implementada é implicitamente um membro da interface predefinida.

Quando uma classe do Visual Basic implementa uma interface, a classe Visual Basic fornece as 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 da interface e os seus procedimentos, a instrução Implementações faz com que a classe aceite chamadas COM QueryInterface para o ID de interface especificado.

Observação

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

Quando implementa uma interface ou classe, tem de incluir todos os procedimentos públicos envolvidos. Um membro em falta numa implementação de uma interface ou classe causa um erro. Se não colocar código num dos procedimentos numa classe que está a implementar, pode gerar o erro adequado (Const E_NOTIMPL = &H80004001) para que um utilizador da implementação compreenda que um membro não está implementado.

A instrução Implementações não pode aparecer num módulo padrão.

Exemplo

O exemplo seguinte mostra como utilizar a instrução Implementações para disponibilizar um conjunto de declarações a várias classes. Ao partilhar as declarações através da instrução Implementações, nenhuma das classes tem de fazer declarações em si. O exemplo também mostra como a utilização de uma interface permite a abstração: uma variável de tipo forte pode ser declarada através do tipo de interface. Em seguida, podem ser atribuídos objetos de diferentes tipos de classe que implementam a interface.

Suponha que existem dois formulários, SelectorForm e DataEntryForm. O formulário do seletor tem dois botões: Dados do Cliente e Dados do Fornecedor. Para introduzir informações de nome e endereço para um cliente ou fornecedor, o utilizador clica no botão cliente ou fornecedor no formulário do seletor e, em seguida, introduz o nome e o endereço utilizando o formulário de introdução de dados. O formulário de introdução de dados tem dois campos de texto, Nome e Endereço.

O seguinte código para as declarações de interface está numa classe denominada PersonalData:

Public Name As String 
Public Address As String 

O código que suporta os dados do cliente está num módulo de classe denominado Cliente. Tenha em atenção que a interface PersonalData é implementada com membros 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 suporta os dados do fornecedor está num módulo de classe denominado 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 seguinte suporta o 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 seguinte suporta o formulário de Introdução 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

Tenha em atenção como, no formulário de introdução de dados, a variável m_pd é declarada através da interface PersonalData e podem ser atribuídos objetos da classe Cliente ou Fornecedor porque ambas as classes implementam a interface PersonalData.

Tenha também em atenção que a variável m_pd só pode aceder aos membros da interface PersonalData. Se lhe for atribuído um objeto Cliente , o CustomerAgentId membro específico do cliente não está disponível. Da mesma forma, se lhe for atribuído um objeto Fornecedor , o Membro específico do fornecedor NumberOfProductLines não está disponível. Atribuir um objeto a variáveis declaradas através de interfaces diferentes proporciona um comportamento polimórfico.

Tenha também em atenção que as classes Cliente e Fornecedor , conforme definido anteriormente, não expõem os membros da interface PersonalData. A única forma de aceder aos membros do PersonalData é atribuir um objeto Cliente ou Fornecedor a uma variável declarada como PersonalData. Se quiser um comportamento semelhante a uma herança, com a classe Cliente ou Fornecedor a expor os membros do PersonalData, os membros públicos têm de ser adicionados à classe. Estes podem ser implementados ao delegar às implementações da interface PersonalData.

Por exemplo, a classe Cliente pode ser expandida 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.