Compartir a través de


Implements (instrucción)

Especifica una interfaz o clase que se implementará en el módulo de clase en que aparece.

Sintaxis

Implementa [ Clase InterfaceName | ]

InterfaceName o Class corresponden al nombre de una interfaz o clase en una biblioteca de tipos cuyos métodos se implementarán mediante los métodos correspondientes en la clase de Visual Basic.

Observaciones

Una interfaz es una colección de prototipos que representan los miembros (métodos y propiedades) que encapsula la interfaz; es decir, solo contiene las declaraciones de los procedimientos miembro. Una clase proporciona una implementación de todos los métodos y propiedades de una o varias interfaces. Las clases proporcionan el código usado cuando se llama a cada controlador de la clase. Todas las clases implementan al menos una interfaz, lo que se considera la interfaz predeterminada de la clase. En Visual Basic, cualquier miembro que no sea explícitamente miembro de una interfaz implementada es implícitamente un miembro de la interfaz predeterminada.

Cuando una clase de Visual Basic implementa una interfaz, la clase de Visual Basic proporciona sus propias versiones de todos los procedimientospublic especificados en la biblioteca de tipos de la interfaz. Además de proporcionar una asignación entre los prototipos de interfaz y sus procedimientos, la instrucción Implements causa que la clase acepte las llamadas de COM QueryInterface del Id. de la interfaz especificado.

Nota:

[!NOTA] Visual Basic no implementa clases o interfaces derivadas.

Al implementar una interfaz o clase, debe incluir todos los procedimientos Public implicados. La falta de un miembro en una implementación de una interfaz o clase provoca un error. Si no pone código en uno de los procedimientos de la clase que está implementando, puede generar el error correspondiente (Const E_NOTIMPL = &H80004001) para que un usuario de la implementación sepa que un miembro no se ha implementado.

La instrucción Implements no puede aparecer en un módulo estándar.

Ejemplo

El siguiente ejemplo muestra cómo usar la instrucción Implements para hacer un conjunto de declaraciones disponibles para varias clases. Al compartir las declaraciones mediante la instrucción Implements, tampoco la clase tiene que realizar declaraciones. En el ejemplo también se muestra cómo el uso de una interfaz permite la abstracción: se puede declarar una variable de tipo fuerte mediante el tipo de interfaz. A continuación, se pueden asignar objetos de diferentes tipos de clase que implementan la interfaz.

Supongamos que hay dos formas, SelectorForm y DataEntryForm. El formulario selector tiene dos botones: Datos de cliente y Datos de proveedor. Para escribir información de nombre y dirección para un cliente o proveedor, el usuario hace clic en el botón cliente o en el botón proveedor del formulario selector y, a continuación, escribe el nombre y la dirección mediante el formulario de entrada de datos. El formulario de entrada de datos tiene dos campos de texto: Nombre y Dirección.

El código siguiente para las declaraciones de interfaz está en una clase denominada PersonalData:

Public Name As String 
Public Address As String 

El código que admite los datos del cliente se encuentra en un módulo de clase denominado Customer. Tenga en cuenta que la interfaz PersonalData se implementa con miembros que se denominan con el nombre PersonalData_ de la interfaz como prefijo.

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

El código que admite los datos del proveedor se encuentra en un módulo de clase denominado Proveedor:

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


El código siguiente admite el formulario Selector :

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

El código siguiente admite el formulario Entrada de datos :

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 cómo, en el formulario de entrada de datos, la variable m_pd se declara mediante la interfaz PersonalData y se pueden asignar objetos de la clase Customer o Supplier porque ambas clases implementan la interfaz PersonalData.

Tenga en cuenta también que la variable m_pd solo puede acceder a los miembros de la interfaz PersonalData. Si se le asigna un objeto Customer , el elemento CustomerAgentId específico del cliente no está disponible. De forma similar, si se le asigna un objeto Supplier , el miembro específico del proveedor NumberOfProductLines no está disponible. La asignación de un objeto a variables declaradas mediante distintas interfaces proporciona un comportamiento polimórfico.

Tenga en cuenta también que las clases Customer y Supplier , como se definió anteriormente, no exponen los miembros de la interfaz PersonalData. La única manera de acceder a los miembros de PersonalData es asignar un objeto Customer o Supplier a una variable declarada como PersonalData. Si se desea un comportamiento similar a la herencia, con la clase Customer o Supplier exponiendo los miembros PersonalData, los miembros públicos deben agregarse a la clase . Se pueden implementar mediante la delegación a las implementaciones de la interfaz PersonalData.

Por ejemplo, la clase Customer podría extenderse con lo siguiente:

'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

Vea también

Soporte técnico y comentarios

¿Tiene preguntas o comentarios sobre VBA para Office o esta documentación? Vea Soporte técnico y comentarios sobre VBA para Office para obtener ayuda sobre las formas en las que puede recibir soporte técnico y enviar comentarios.