Interfaces (Visual Basic)

As interfaces definem as propriedades, os métodos e os eventos que as classes podem implementar. As interfaces permitem definir as funcionalidades como pequenos grupos de propriedades, de métodos e de eventos estreitamente relacionados. Isso reduz os problemas de compatibilidade, uma vez que é possível desenvolver implementações avançadas para as interfaces sem arriscar o código existente. Você pode adicionar novas funcionalidades a qualquer momento desenvolvendo interfaces e implementações adicionais.

Há vários outros motivos pelos quais você possa querer usar interfaces em vez da herança de classe:

  • As interfaces são mais adequadas para situações em que os aplicativos exigem muitos tipos de objeto possivelmente não relacionados para fornecer determinadas funcionalidades.

  • As interfaces são mais flexíveis que as classes base, uma vez que é possível definir uma única implementação que pode implementar várias interfaces.

  • As interfaces são mais adequadas em situações em que você não precisa herdar a implementação de uma classe base.

  • As interfaces são úteis quando você não pode usar herança de classe. Por exemplo, as estruturas não podem herdar de classes, mas podem implementar interfaces.

Declarando interfaces

As definições de interface são colocadas entre as instruções Interface e End Interface. Após a instrução Interface, você pode adicionar uma instrução Inherits opcional que lista uma ou mais interfaces herdadas. As instruções Inherits devem preceder todas as outras instruções nos comentários de exceção de declaração. As instruções restantes na definição da interface devem ser as instruções Event, Sub, Function, Property, Interface, Class, Structure e Enum. As interfaces não podem conter código de implementação nem instruções associadas ao código de implementação, como End Sub ou End Property.

Em um namespace, as instruções de interface são Friend por padrão, mas também podem ser declaradas explicitamente como Public ou Friend. As interfaces definidas em classes, em módulos, em interfaces e em estruturas são Public por padrão, mas também podem ser explicitamente declaradas como Public, Friend, Protected ou Private.

Observação

A palavra-chave Shadows pode ser aplicada a todos os membros de interface. A palavra-chave Overloads pode ser aplicada às instruções Sub, Function e Property declaradas em uma definição de interface. Além disso, as instruções Property podem ter os modificadores Default, ReadOnly ou WriteOnly. Nenhum dos outros modificadores (Public, Private, Friend, Protected, Shared, Overrides, MustOverride ou Overridable) são permitidos. Para obter mais informações, consulte Contextos de declaração e níveis de acesso padrão.

Por exemplo, o código a seguir define uma interface com uma função, uma propriedade e um evento.

Interface IAsset
    Event ComittedChange(ByVal Success As Boolean)
    Property Division() As String
    Function GetID() As Integer
End Interface

Implementando interfaces

A palavra reservada Implements de Visual Basic é usada de dois modos. A instrução Implements significa que uma classe ou estrutura implementa uma interface. A palavra-chave Implements significa que um membro de classe ou um membro da estrutura implementa um membro de interface específico.

Instrução Implements

Se uma classe ou estrutura implementa uma ou mais interfaces, ela deve incluir a instrução Implements imediatamente após a instrução Class ou Structure. A instrução Implements exige uma lista de interfaces separadas por vírgula a serem implementadas por uma classe. A classe ou a estrutura deve implementar todos os membros da interface usando a palavra-chave Implements.

Palavra-chave Implements

A palavra-chave Implements exige uma lista dos membros de interface separados por vírgula a serem implementados. Em geral, apenas um único membro de interface é especificado, mas você pode especificar vários membros. A especificação de um membro de interface é composta pelo nome da interface, que deve ser especificado em uma instrução implements na classe, um período e o nome da função, da propriedade ou do evento do membro a ser implementado. O nome de um membro que implementa um membro de interface pode usar qualquer identificador válido e não está limitado à convenção InterfaceName_MethodName usada em versões anteriores do Visual Basic.

Por exemplo, o código a seguir mostra como declarar uma sub-rotina chamada Sub1 que implementa um método de uma interface:

Class Class1
    Implements interfaceclass.interface2

    Sub Sub1(ByVal i As Integer) Implements interfaceclass.interface2.Sub1
    End Sub
End Class

Os tipos de parâmetro e de retorno do membro implementado devem corresponder à propriedade da interface ou à declaração do membro na interface. A maneira mais comum de implementar um elemento de uma interface é com um membro que tem o mesmo nome que a interface, conforme mostrado no exemplo anterior.

Para declarar a implementação de um método de interface, você pode usar os atributos válidos em declarações de método de instância, incluindo Overloads, Overrides, Overridable, Public, Private, Protected, Friend, Protected Friend, MustOverride, Default e Static. O atributo Shared não é válido, uma vez que define uma classe em vez de um método de instância.

Ao usar Implements, você também pode escrever um único método que implementa vários métodos definidos em uma interface, como no exemplo a seguir:

Class Class2
    Implements I1, I2

    Protected Sub M1() Implements I1.M1, I1.M2, I2.M3, I2.M4
    End Sub
End Class

Você pode usar um membro particular para implementar um membro de interface. Quando um membro particular implementa um membro de uma interface, esse membro fica disponível por meio da interface, embora não esteja disponível diretamente em variáveis de objeto para a classe.

Exemplos de implementação de interface

As classes que implementam uma interface devem implementar todas as suas propriedades, métodos e eventos.

O exemplo a seguir define duas interfaces. A segunda interface, Interface2, herda Interface1 e define uma propriedade e um método adicionais.

Interface Interface1
    Sub sub1(ByVal i As Integer)
End Interface

' Demonstrates interface inheritance.
Interface Interface2
    Inherits Interface1
    Sub M1(ByVal y As Integer)
    ReadOnly Property Num() As Integer
End Interface

O exemplo a seguir implementa Interface1, a interface definida no exemplo anterior:

Public Class ImplementationClass1
    Implements Interface1
    Sub Sub1(ByVal i As Integer) Implements Interface1.sub1
        ' Insert code here to implement this method.
    End Sub
End Class

O exemplo final implementa Interface2, incluindo um método herdado de Interface1:

Public Class ImplementationClass2
    Implements Interface2
    Dim INum As Integer = 0
    Sub sub1(ByVal i As Integer) Implements Interface2.sub1
        ' Insert code here that implements this method.
    End Sub
    Sub M1(ByVal x As Integer) Implements Interface2.M1
        ' Insert code here to implement this method.
    End Sub

    ReadOnly Property Num() As Integer Implements Interface2.Num
        Get
            Num = INum
        End Get
    End Property
End Class

Você pode implementar uma propriedade readonly com uma propriedade readwrite (ou seja, você não precisa declará-la como readonly na classe sendo implementada). Implementar uma interface significa implementar pelo menos os membros que a interface declara, mas você pode oferecer mais funcionalidades, como permitir que a propriedade seja gravável.

Título Descrição
Passo a passo: Criação e implementação de interfaces Fornece um procedimento detalhado que o guiará pelo processo de definição e de implementação de sua própria interface.
Variação em interfaces genéricas Discute a covariância e a contravariância em interfaces genéricas e fornece uma lista de interfaces genéricas variáveis no .NET Framework.