Compartilhar via


Objetos e classes no Visual Basic

Um objeto é uma combinação de código e dados que podem ser tratados como uma unidade. Um objeto pode ser uma parte de um aplicativo, como um controle ou um formulário. Todo o aplicativo também pode ser um objeto.

Ao criar um aplicativo em Visual Basic, você constantemente trabalha com objetos. Você pode usar os objetos fornecidos pelo Visual Basic, como controles, formulários e objetos de acesso a dados. Você também pode usar objetos de outros aplicativos em seu aplicativo Visual Basic. Você pode até mesmo criar seus próprios objetos e definir propriedades e métodos adicionais para eles. Os objetos atuam como blocos de construção pré-fabricados para programas. Eles permitem que você escreva um trecho de código uma vez e reutilize repetidamente.

Este tópico discute os objetos em detalhes.

Objetos e classes

Cada objeto no Visual Basic é definido por uma classe. Uma classe descreve as variáveis, as propriedades, os procedimentos e os eventos de um objeto. Os objetos são instâncias de classes. Você pode criar a quantidade de objetos que precisar após ter definido uma classe.

Para entender a relação entre um objeto e sua classe, pense em cookies e cortadores de cookie. O cortador de cookie é a classe. Ele define as características de cada cookie, por exemplo, tamanho e forma. A classe é usada para criar objetos. Os objetos são os cookies.

Você deve criar um objeto antes de poder acessar seus membros, exceto para Shared membros que podem ser acessados sem um objeto da classe.

Criar um objeto com base em uma classe

  1. Determine de qual classe você deseja criar um objeto ou defina sua própria classe. Por exemplo:

    Public Class Customer
        Public Property AccountNumber As Integer
    End Class
    
  2. Escreva uma instrução Dim para criar uma variável a qual você pode atribuir uma instância da classe. A variável deve ser do tipo da classe desejada.

    Dim nextCustomer As Customer
    
  3. Adicione a palavra-chave novo operador para inicializar a variável a uma nova instância da classe.

    Dim nextCustomer As New Customer
    
  4. Agora você pode acessar os membros da classe pela variável de objeto.

    nextCustomer.AccountNumber = lastAccountNumber + 1
    

Observação

Sempre que possível, você deve declarar a variável para ser do tipo de classe que você pretende atribuir a ela. Isso é chamado de associação inicial. Se não souber o tipo de classe no tempo de compilação, você poderá invocar a associação tardia, declarando a variável como o Tipo de Dados do Objeto. Entretanto, a associação tardia pode tornar o desempenho mais lento e limitar o acesso a membros do objeto do tempo de execução. Para obter mais informações, consulte Declaração de variável de objeto.

Várias instâncias

Objetos recentemente criados de uma classe geralmente são idênticos entre si. Assim que existem como objetos individuais, no entanto, suas propriedades e variáveis podem ser alteradas independentemente de outras instâncias. Por exemplo, se você adicionar três caixas de seleção a um formulário, cada objeto da caixa de seleção será uma instância da classe CheckBox. Os objetos CheckBox individuais compartilham um conjunto comum de características e recursos (propriedades, variáveis, procedimentos e eventos) definidos pela classe. No entanto, cada um tem seu próprio nome, pode ser separadamente habilitado e desabilitado e pode ser colocado em um local diferente no formulário.

Membros do objeto

Um objeto é um elemento de um aplicativo, que representa uma instância de uma classe. Campos, propriedades, métodos e eventos são os blocos de construção de objetos e constituem seus membros.

Acesso de membro

É possível acessar um membro de um objeto especificando, em ordem, o nome da variável do objeto, um período (.) e o nome do membro. O exemplo a seguir define a propriedade Text de um objeto Label.

warningLabel.Text = "Data not saved"

Lista do IntelliSense de membros

O IntelliSense lista os membros de uma classe quando você invoca sua opção de membros da lista, por exemplo, ao digitar um ponto final (.) como um operador de acesso de membro. Se você digitar o período após o nome de uma variável declarada como uma instância da classe, o IntelliSense listará todos os membros de instância e nenhum dos membros compartilhados. Se você digitar o ponto final após o nome da classe, o IntelliSense listará todos os membros compartilhados e nenhum dos membros de instância. Para obter mais informações, veja Usando o IntelliSense.

Campos e propriedades

Os campos e as propriedades representam as informações armazenadas em um objeto. Você recupera e define seus valores com instruções de atribuição da mesma maneira que você recupera e define variáveis locais em um procedimento. O exemplo a seguir recupera a propriedade Width e define a propriedade ForeColor de um objeto Label.

Dim warningWidth As Integer = warningLabel.Width
warningLabel.ForeColor = System.Drawing.Color.Red

Observe que um campo também é chamado de uma variável membro.

Use os procedimentos de propriedade quando:

  • Precisar controlar quando e como um valor é definido ou recuperado.

  • A propriedade tiver um conjunto bem definido de valores que precisam ser validados.

  • Definir o valor causa algumas alterações perceptíveis no estado do objeto, como um propriedade IsVisible.

  • Definir a propriedade faz alterações em outras variáveis internas ou nos valores de outras propriedades.

  • Um conjunto de etapas deve ser executado antes de a propriedade pode ser definida ou recuperada.

Use os campos quando:

  • O valor for de um tipo de validação automática. Por exemplo, um erro ou a conversão automática de dados ocorrerá se um valor diferente de True ou False for atribuído a uma variável Boolean.

  • Qualquer valor no intervalo com suporte do tipo de dados é válido. Isso é verdadeiro para muitas propriedades de tipo Single ou Double.

  • A propriedade é um tipo de dados String e não há restrição sobre o tamanho ou o valor da cadeia de caracteres.

  • Para obter mais informações, consulte Procedimentos de propriedade.

Dica

Sempre mantenha os campos não constantes privados. Quando você quiser torná-la pública, use uma propriedade.

Métodos

Um método é uma ação que um objeto pode executar. Por exemplo, Add é um método do objeto ComboBox que adiciona uma nova entrada para uma caixa de combinação.

O exemplo a seguir demonstra o método Start de um objeto Timer.

Dim safetyTimer As New System.Windows.Forms.Timer
safetyTimer.Start()

Observe que um método é simplesmente um procedimento que é exposto por um objeto.

Para obter mais informações, consulte Procedimentos.

Eventos

Um evento é uma ação reconhecida por um objeto, como clicar com o mouse ou pressionar uma tecla e para o qual você pode escrever código para responder. Os eventos podem ocorrer como resultado de uma ação do usuário ou código do programa, ou eles podem ser causados pelo sistema. O código que sinaliza um evento aciona o evento e o código que responde a ele lida com ele.

Você também pode desenvolver seus próprios eventos personalizados para serem acionados por seus objetos e manipulados por outros objetos. Para obter mais informações, consulte Eventos.

Membros de instância e membros compartilhados

Quando você cria um objeto de uma classe, o resultado é uma instância dessa classe. Membros que não são declarados com a palavra-chave compartilhado são membros de instância, que pertencem estritamente a essa instância em particular. Um membro de instância em uma instância é independente do mesmo membro em outra instância da mesma classe. Por exemplo, uma variável de membro de instância pode ter valores diferentes em instâncias diferentes.

Membros declarados com a palavra-chave Shared são membros compartilhados, que pertencem à classe como um todo e não a qualquer instância específica. Um membro compartilhado existe somente uma vez, independentemente de quantas instâncias de sua classe você cria ou mesmo se você não criar nenhuma instância. Uma variável de membro compartilhado, por exemplo, tem apenas um valor, que está disponível para todo o código que pode acessar a classe.

Acessando membros não compartilhados

  1. Verifique se o objeto foi criado com base na sua classe e atribuído a uma variável de objeto.

    Dim secondForm As New System.Windows.Forms.Form
    
  2. Na instrução que acessa o membro, siga o nome de variável de objeto com o operador de acesso de membro (.) e, em seguida, o nome do membro.

    secondForm.Show()
    

Acessando membros compartilhados

  • Siga o nome da classe com o operador de acesso de membro (.) e, em seguida, o nome do membro. Você sempre deve acessar um membro do objeto Shared diretamente pelo nome da classe.

    Console.WriteLine("This computer is called " & Environment.MachineName)
    
  • Se já tiver criado um objeto da classe, você também poderá acessar um membro Shared pela variável do objeto.

Diferenças entre classes e módulos

A principal diferença entre classes e módulos é que as classes podem ser instanciadas como objetos enquanto os módulos padrão não podem. Como há apenas uma cópia dos dados de um módulo padrão, quando uma parte do seu programa altera uma variável pública em um módulo padrão, qualquer outra parte do programa obtém o mesmo valor se ler essa variável. Em contraste, os dados do objeto existem separadamente para cada objeto instanciado. Outra diferença é que, diferentemente dos módulos padrão, as classes podem implementar interfaces. Se uma classe for marcada com o modificador MustInherit, ela não poderá ser instanciada diretamente. No entanto, ele ainda é diferente de um módulo, pois pode ser herdado enquanto os módulos não podem ser herdados.

Observação

Quando o modificador Shared é aplicado a um membro de classe, ele é associado à classe em si em vez de uma determinada instância da classe. O membro é acessado diretamente usando o nome de classe, do mesmo que os membros do módulo são acessados.

Classes e módulos também usam escopos diferentes para seus membros. Membros definidos em uma classe têm escopo em uma instância específica da classe e existem somente para o tempo de vida do objeto. Para acessar membros de classe de fora de uma classe, você deve usar nomes totalmente qualificados no formato de Objeto.Membro.

Por outro lado, os membros declarados dentro de um módulo são acessíveis publicamente por padrão e podem ser acessados por qualquer código que pode acessar o módulo. Isso significa que variáveis em um módulo padrão são variáveis globais efetivamente porque elas são visíveis de qualquer lugar em seu projeto e existem durante a vida útil do programa.

Reutilização de classes e objetos

Os objetos permitem que você declare variáveis e procedimentos uma vez e reutilize-os quando necessário. Por exemplo, se desejar adicionar um verificador ortográfico a um aplicativo, defina todas as variáveis e funções de suporte para fornecer a funcionalidade de verificação ortográfica. Se criar o verificador de ortografia como uma classe, você poderá reutilizá-lo em outros aplicativos adicionando uma referência ao assembly compilado. Melhor ainda, você poderá diminuir seu trabalho usando uma classe de verificador ortográfico que alguém já desenvolveu.

O .NET fornece vários exemplos de componentes que estão disponíveis para uso. O exemplo a seguir usa a classe TimeZone no namespace System. TimeZone fornece membros que permitem que você recupere informações sobre o fuso horário do sistema atual do computador.

Public Sub ExamineTimeZone()
    Dim tz As System.TimeZone = System.TimeZone.CurrentTimeZone
    Dim s As String = "Current time zone is "
    s &= CStr(tz.GetUtcOffset(Now).Hours) & " hours and "
    s &= CStr(tz.GetUtcOffset(Now).Minutes) & " minutes "
    s &= "different from UTC (coordinated universal time)"
    s &= vbCrLf & "and is currently "
    If tz.IsDaylightSavingTime(Now) = False Then s &= "not "
    s &= "on ""summer time""."
    Console.WriteLine(s)
End Sub

No exemplo anterior, o primeiro Demonstrativo Esmaecido declara uma variável de objeto do tipo TimeZone e atribui a ele um objeto TimeZone retornado pela propriedade CurrentTimeZone.

Relacionamentos entre objetos

Os objetos podem estar relacionados entre si de várias maneiras. Os principais tipos de relação são hierárquico e confinamento.

Relação hierárquica

Quando classes são derivadas de classes mais fundamentais, elas devem ter um relacionamento hierárquico. As hierarquias de classe são úteis para descrever itens que são um subtipo de uma classe mais geral.

No exemplo a seguir, suponha que você deseja definir um tipo especial de Button que atua como um Button normal, mas também expõe um método que reverte as cores de primeiro plano e da tela de fundo.

Como definir uma classe derivada de uma classe já existente

  1. Use uma instrução Class para definir uma classe da qual criar o objeto que você precisa.

    Public Class ReversibleButton
    

    Certifique-se de que uma instrução End Class segue a última linha de código em sua classe. Por padrão, o IDE (ambiente de desenvolvimento integrado) gera automaticamente um End Class quando você insere uma instrução Class.

  2. Siga a instrução Class imediatamente com uma instrução Inherits. Especifique a classe da qual a nova classe deriva.

    Inherits System.Windows.Forms.Button
    

    A nova classe herda todos os membros definidos pela classe base.

  3. Adicione o código para os membros adicionais que sua classe derivada expõe. Por exemplo, você pode adicionar um método ReverseColors e sua classe derivada será semelhante ao seguinte:

    Public Class ReversibleButton
        Inherits System.Windows.Forms.Button
            Public Sub ReverseColors()
                Dim saveColor As System.Drawing.Color = Me.BackColor
                Me.BackColor = Me.ForeColor
                Me.ForeColor = saveColor
           End Sub
    End Class
    

    Se você criar um objeto da classe ReversibleButton, ele poderá acessar todos os membros da classe Button, bem como o método ReverseColors e quaisquer outros novos membros que você definir no ReversibleButton.

As classes derivadas herdam membros da classe que eles se baseiam, permitindo que você adicione complexidade enquanto progride em uma hierarquia de classe. Para obter mais informações, consulte Noções básicas de herança.

Compilar o código

Certifique-se de que o compilador pode acessar a classe da qual você pretende derivar sua nova classe. Isso pode significar qualificar totalmente seu nome, como no exemplo anterior, ou identificar seu namespace em uma Instrução Imports (Tipo e Namespace .NET). Se a classe estiver em um projeto diferente, você precisará adicionar uma referência ao projeto. Para obter mais informações, consulte Gerenciando referências em um projeto.

Relação de confinamento

Outro modo de relação dos objetos é a relação de confinamento. Os objetos de contêiner encapsulam logicamente outros objetos. Por exemplo, o objeto OperatingSystem logicamente contém um objeto Version, que ele retorna por intermédio de sua propriedade Version. Observe que o objeto de contêiner não contém fisicamente qualquer outro objeto.

Coleções

Um tipo específico de confinamento de objeto é representado pelas coleções. As coleções são grupos de objetos semelhantes que podem ser enumerados. O Visual Basic dá suporte a uma sintaxe específica na instrução For Each...Next que permite que você itere pelos itens de uma coleção. Além disso, as coleções permitem, com frequência, que você use um Item[] para recuperar elementos pelo índice ou associando-os com uma cadeia de caracteres exclusiva. As coleções podem ser mais fáceis de usar que matrizes porque elas permitem que você adicione ou remova itens sem usar índices. Devido à facilidade de uso, as coleções geralmente são usadas para armazenar formulários e controles.

Instruções passo a passo: definindo classes
Fornece uma descrição passo a passo de como criar uma classe.

Propriedades e métodos sobrecarregados
Propriedades e métodos sobrecarregados

Noções básicas de herança
Aborda modificadores de herança, substituindo métodos e propriedades, MyClass e MyBase.

Tempo de vida do objeto: como os objetos são criados e destruídos
Aborda a criação e descarte de instâncias de classe.

Tipos anônimos
Descreve como criar e usar tipos anônimos, que permitem que você crie objetos sem escrever uma definição de classe para o tipo de dados.

Inicializadores de objeto: tipos nomeados e anônimos
Discute inicializadores de objeto, que são usados para criar instâncias de tipos nomeados e anônimos usando uma única expressão.

Como inferir nomes e tipos de propriedade na declaração de tipo anônimo
Explica como inferir nomes e tipos de propriedade em declarações de tipo anônimo. Fornece exemplos de inferência de tipos com e sem êxito.