programação orientada a objetos no visual basic

41
Programação orientada a objetos no Visual Basic Objetos são fundamentais para programação de Visual Basic: Formulários e controles são objetos. Bancos de dados são objetos. Se você tiver usado Visual Basic por um tempo, ou caso você tenha trabalhado através de exemplos na documentação, então você programou com objetos, mas há muito mais objetos do que você viu até o momento. Nos tópicos a seguir, você verá como é fácil criar seus próprios objetos a partir de classes que você define e para usar objetos para simplificar sua codificação e aumentar a reutilização de código. Nesta seção Introdução a Objetos no Visual Basic Fornece uma introdução aos termos e conceitos usados em programação orientada a objetos. Noções básicas sobre classes Fornece uma visão geral das classes e um exemplo de como definir uma classe. Criando e Usando Objetos Mostra como criar e usar as instâncias das classes. Coleções em Visual Basic Fornece uma visão geral das coleções. Eventos no Visual Basic Mostra como Declarar e usar os eventos. Delegados no Visual Basic Mostra como Declarar e usar delegados. Interfaces em Visual Basic Descreve o que são interfaces e como você pode usá-las em seus aplicativos. A herança no Visual Basic Descreve como definir classes Visual Basic para servirem como base para outras classes. Membros compartilhados no Visual Basic Descreve os membros que podem ser usados sem instâncias. Vinculação antecipada e mais tarde Descreve a vinculação, que é executada pelo compilador quando um objeto é atribuído a uma variável de objeto e as diferenças entre objetos com vinculação-antecipada e vinculação atrasada. Introdução a Objetos no Visual Basic Um objeto é uma estrutura quem contém dados e métodos para manipular os dados. Quase tudo que você faz em Visual Basic é associado com objetos. Se você é novato na programação orientada a objetos, os termos e conceitos a seguir vão lhe ajudar nesta fase introdutória. Classes e Objetos As palavras "classe" e "objeto" são tão usadas em programação orientada a objeto que é fácil confundir os termos. De modo geral, uma class é uma representação abstrata de algo, enquanto um objeto é um exemplo manipulável daquilo que a classe representa. A única exceção a esta regra são os membros da classe compartilhados, que são manipuláveis em ambas as instâncias de uma classe e variáveis de objeto declaradas como o tipo da classe. Campos, Propriedades, Métodos e Eventos Classes consistem de campos, propriedades, métodos e eventos. Campos e propriedades representam informações que um objeto contém. Campos são como variáveis, porque eles podem ser lidos ou alterados diretamente. Por exemplo, se você tem um objeto chamado "Carro" você pode armazenar sua cor em um campo chamado "Cor."

Upload: jefferson-passerini

Post on 03-Jul-2015

737 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Programação orientada a objetos no Visual Basic

Programação orientada a objetos no Visual BasicObjetos são fundamentais para programação de Visual Basic: Formulários e controles são objetos. Bancos de dados são objetos. Se você tiver usado Visual Basic por um tempo, ou caso você tenha trabalhado através de exemplos na documentação, então você programou com objetos, mas há muito mais objetos do que você viu até o momento. Nos tópicos a seguir, você verá como é fácil criar seus próprios objetos a partir de classes que você define e para usar objetos para simplificar sua codificação e aumentar a reutilização de código.  Nesta seção

Introdução a Objetos no Visual BasicFornece uma introdução aos termos e conceitos usados em programação orientada a objetos.

Noções básicas sobre classesFornece uma visão geral das classes e um exemplo de como definir uma classe.

Criando e Usando ObjetosMostra como criar e usar as instâncias das classes.

Coleções em Visual BasicFornece uma visão geral das coleções.

Eventos no Visual BasicMostra como Declarar e usar os eventos.

Delegados no Visual Basic Mostra como Declarar e usar delegados.

Interfaces em Visual BasicDescreve o que são interfaces e como você pode usá-las em seus aplicativos.

A herança no Visual BasicDescreve como definir classes Visual Basic para servirem como base para outras classes.

Membros compartilhados no Visual BasicDescreve os membros que podem ser usados sem instâncias.

Vinculação antecipada e mais tardeDescreve a vinculação, que é executada pelo compilador quando um objeto é atribuído a uma variável de objeto e as diferenças entre objetos com vinculação-antecipada e vinculação atrasada.

Introdução a Objetos no Visual BasicUm objeto é uma estrutura quem contém dados e métodos para manipular os dados. Quase tudo que você faz em Visual Basic é associado com objetos. Se você é novato na programação orientada a objetos, os termos e conceitos a seguir vão lhe ajudar nesta fase introdutória.  Classes e Objetos

As palavras "classe" e "objeto" são tão usadas em programação orientada a objeto que é fácil confundir os termos. De modo geral, uma class é uma representação abstrata de algo, enquanto um objeto é um exemplo manipulável daquilo que a classe representa. A única exceção a esta regra são os membros da classe compartilhados, que são manipuláveis em ambas as instâncias de uma classe e variáveis de objeto declaradas como o tipo da classe.  Campos, Propriedades, Métodos e Eventos

Classes consistem de campos, propriedades, métodos e eventos. Campos e propriedades representam informações que um objeto contém. Campos são como variáveis, porque eles podem ser lidos ou alterados diretamente. Por exemplo, se você tem um objeto chamado "Carro" você pode armazenar sua cor em um campo chamado "Cor." Propriedades são recuperadas e modificadas como campos, mas são implementadas pelos procedimentos Get e Set, que fornecem maior controle sobre como valores são alterados ou recuperados. A camada indireta entre o valor sendo armazenado e os procedimentos que usam este valor ajuda a isolar seus dados e permite que você valide valores antes de eles serem atribuídos ou recuperados. Métodos representam ações que um objeto pode realizar. Por exemplo, um objeto "Carro" pode ter os métodos "PartidaNoMotor", "Dirigir" e "Parar". Você define métodos ao adicionar procedimentos, quer sejam Sub rotinas ou funções, a sua classe. Eventos são notificações que um objeto recebe de, ou transmite para, outros objetos ou aplicativos. Eventos permitem que objetos realizem ações sempre que uma ocorrência específica ocorrer. Um exemplo de evento para a classe "Carro" seria o evento "Check-Eengine". Como o Microsoft Windows é um sistema operacional movido por eventos, eventos podem vir de outros objetos, aplicativos ou de entradas do usuário como cliques do mouse ou teclas pressionadas.  Encapsulamento, Herança e Polimorfismo

Page 2: Programação orientada a objetos no Visual Basic

Campos, propriedades, métodos e eventos são apenas a metade da equação da programação orientada a objeto. Verdadeira programação orientada a objeto requer objetos para suporte de três qualidades: Encapsulamento, herança e polimorfismo. Encapsulamento significa que um grupo de propriedades, métodos e outros membros relacionados são tratados como unidade ou um objeto único. Objetos podem controlar como as propriedades são alteradas e os métodos são executados. Por exemplo, um objeto pode validar valores antes de permitir que as propriedades mudem. Encapsulamento também torna mais fácil de alterar a implementação em uma ocasião mais tarde permitindo que você oculte detalhes da implementação de seus objetos, uma prática conhecida como ocultamento de dados. Herança descreve a habilidade de se criarem novas classes baseadas em uma classe pré-existente. A nova classe herda todas as propriedades, métodos e eventos da classe base, e pode ser customizada com propriedades e métodos adicionais. Por exemplo, você pode criar uma nova classe chamada "Caminhão" baseada na classe "Carro". A classe "Caminhão" herda a propriedade "Cor" da classe "Carro" e pode ter propriedades adicionais como "TraçãoEmQuatroRodas". Polimorfismo significa que você pode ter múltiplas classes que podem ser usadas intercambiavelmente, mesmo que cada classe implemente as mesmas propriedades e métodos de modos diferentes. Polimorfismo é importante para a programação orientada a objeto porque permite que você use itens com o mesmo nome, independente de qual tipo de objeto está em uso no momento. Por exemplo, dada a classe base "Carro", o polimorfismo permite que o programador defina diferentes métodos "PartidaNoMotor" para qualquer número de classes derivadas. O método "PartidaNoMotor" de uma classe derivada chamada "CarroADiesel" pode ser completamente diferente do método de mesmo nome na classe base. Outros procedimentos ou métodos podem usar o método "PartidaNoMotor" da classe derivada da mesma maneira, sem importar qual tipo de objeto "Carro" está sendo usado no momento.  Sobrecarga, Substituição e Sombreamento

Sobrecarga, substituição e sombreamento são conceitos similares que podem ser facilmente confundidos. Embora todas as três técnicas permitam que você crie membros com o mesmo nome, há algumas diferenças importantes.

Membros sobrecarregados são usados para prover diferentes versões de uma propriedade

ou método que têm o mesmo nome, mas aceitam diferente número de parâmetros ou

parâmetros com diferentes tipos de dados.

Propriedades e métodos substituídos são usados para substituir uma propriedade ou

método herdado que não é apropriado à classe derivada. Membros substituídos devem

aceitar o mesmo tipo de dados e número de argumentos. Classes derivadas herdam

membros substituídos.

Membros sombreados são usados para substituir localmente um membro que tem um

escopo mais amplo. Qualquer tipo pode sombrear qualquer outro tipo. Por exemplo, você

pode declarar uma propriedade que sombreia um método herdado com o mesmo nome.

Membros sombreados não podem ser herdados.

Noções básicas sobre classesClasses são importantes porque permitem que você agrupar itens relacionados como uma unidade, bem como controlar sua visibilidade e acessibilidade de outros procedimentos de programação orientada a objeto. Classes também podem herdar e reutilizar código definido em Outro classes.

Classes: Plantas para objetosClasses são representações simbólicas de objetos; classes descrevem as propriedades, campos, métodos e eventos que forma objetos da mesma forma que plantas descrevem os itens que formam construções. Assim com uma planta pode ser usada para criar diversas construções, uma única classe pode ser usada para criar quantos objetos forem necessários. Assim como uma planta define quais partes da construção são acessíveis para pessoas que usam a construção, classes podem controlar o acesso de usuários a itens do objeto através de encapsulação.  Classes e Objetos

Os termos classe e objeto são às vezes usados representando a mesma coisa, mas na verdade, classes descrevem a estrutura de objetos, enquanto objetos são instâncias úteis de classes. Cada

Page 3: Programação orientada a objetos no Visual Basic

instância é uma cópia exata ainda distinta da sua classe. Porque um objeto é uma instância de uma classe, o ato de criação de um objeto é chamado instanciação. Cada instância é uma cópia exata ainda distinta da sua classe. Porque um objeto é uma instância de uma classe, o ato de criação de um objeto é chamado instanciação. Usando a analogia da planta, a classe é a planta, e o objeto é a construção feita daquela planta. Geralmente, a mudança de dados num objeto não muda as informações contidas em nenhum outro objeto. (A exceção são os membros compartilhados, membros de classe declarados com o modificador Shared, que existem independentemente de instâncias específicas da classe.)  Encapsulamento

Encapsulamento é a habilidade de conter e controlar o acesso a um grupo de itens associados. Classes fornecem um dos modos mais comuns de encapsular itens. No exemplo abaixo, a classe BankAccount encapsula os métodos, campos, e propriedade que descrevem a conta de banco. Sem encapsulação, você declararia procedimentos separados e variável para armazenar e gerenciar informação da conta de banco, e isso tornaria difícil trabalhar com mais de uma conta ao mesmo tempo. Com encapsulamento você pode usar as informações e procedimentos na classe BankAccount como uma unidade. Você pode trabalhar com contas de banco múltiplas concomitantemente sem confusão pois cada conta é representada por uma instância única da classe. Encapsulamento também permite controlar como a informação e procedimentos são usados. Você pode usar modificadores de acesso, como Private ou Protected, para previnir procedimentos externos de executar métodos de classe ou ler e modificar dados em procedimentos e campos. Você deve declarar detalhes internos de uma classe como Private para previnir que eles sejam usados fora da classe; essa técnica é chamada de esconder informações, e é como informações do cliente como o saldo da conta são protegidas. Uma regra básica de encapsulamento é que dados da classe devem ser modificados ou recuperados somente através de procedimentos ou métodos Property. Escondendo os detalhes da implementação de suas classes, previne as classes  de serem usadas de forma não desejada, e permite que você modifique esses itens no futuro sem risco de problemas de compatibilidade. Por exemplo, versões posteriores da classe BankAccount poderiam mudar o tipo de dados do campo AccountBalance sem quebrar outras aplicações que dependem desse campo tendo um tipo específico de tipo de dados.  Herança

Como estruturas Visual Basic, você pode usar classes para defiir tipos de dados que encapsulam um grupo de itens relacionados. Diferentemente de estruturas, no entanto, classes Visual Basic podem herdar e extender as características de outras classes. Classes que servem como base para Novo classes são chamados de classes base . Classes derivadas de classes base são chamadas classes derivadas. Classes derivadas herdam todos os campos, propriedades, métodos e eventos da classe base. Isso significa que você pode desenvolver e debugar uma classe por vez e, depois reusá-la como base para outras classes. O seguinte exemplo define uma classe base que representa uma conta bancária genérica, e uma classe específica que herda as propriedades da classe base mas é customizada para descrever uma conta corrente. Visual Basic

Copiar Código Class BankAccount Private AccountNumber As String Private AccountBalance As Decimal Private HoldOnAccount As Boolean = False Public Sub PostInterest() ' Add code to calculate the interest for this account. End Sub ReadOnly Property Balance() As Decimal Get ' Return the available balance. Return AccountBalance End Get End PropertyEnd Class

Class CheckingAccount Inherits BankAccount Sub ProcessCheck() ' Add code to process a check drawn on this account. End SubEnd Class

Page 4: Programação orientada a objetos no Visual Basic

Para obter mais informações sobre herança, consulte Noções básicas sobre herança.  Membros compartilhados

Por padrão, os dados da classe são específicos para cada instância da classe, mas pode haver ocasiões em que você queira que um único item de dados seja compartilhado por todos objetos criados de uma classe. Nesses casos, use o modificador Shared para fazer com que uma variável compartilhe o mesmo valor em todas instâncias de uma classe ( Membros Compartilhados são algumas vezes chamados de "Membros Estáticos" em outras linguagens de programação). Você pode chamar métodos compartilhados diretamente usando um nome de classe sem antes criar uma instância dessa classe. Para obter mais informações sobre membros compartilhados, veja Membros compartilhados no Visual Basic.  Sombreamento

Classes derivadas podem usar a palavra chave Shadows para declarar um membro com o mesmo nome que um membro herdado. Membros sombreados não precisam ser do mesmo tipo de dados que o membro sendo sombreado. Por exemplo, uma propriedade pode sombrear uma variável do tipo Integer. Para obter mais informações sobre membros compartilhados, veja Sombreamento em Visual Basic.

Demonstra Passo a passo: Definir classesEssa explicação passo a passo demonstra como definir classes, que você pode usar para criar objetos. Ele também mostra como adicionar propriedades e métodos à nova classe e demonstra como inicializar um objeto.

Observação:

As caixas de Caixa de diálogo e o menu comandos você consulte pode diferir daquelas descritas na Ajuda , Dependendo de suas configurações Ativo ou edição. Para alterar as configurações, Clique em Importar e exportar configurações no menu Ferramentas. Para obter mais informações, consulte Configurações do Visual Studio.

Para definir uma classe

1. Crie um projeto, clicando em Novo Projeto no menu Arquivo. A caixa de diálogo Novo

Projeto aparecerá.

2. Selecione aplicativos do Windows na lista de modelos de projetos Visual Basic para exibir

o novo projeto.

3. Adicione uma nova classe ao projeto, clicando em Adicionar Classe no menu de Projeto.

A caixa de diálogo Adicionar novo item é exibida.

4. Selecione o modelo Classe.

5. Nomeie a nova classe UserNameInfo.vb e, em seguida, clique em Adicionar para exibir

o código para a nova classe.

Visual Basic

Copiar Código

Public Class UserNameInfo

End Class

Observação:

Você pode usar o Visual Basic Code Editor to add a class to your startup form by typing the Class keyword followed by the name of the new class. O Editor de Códigos fornece uma instrução End Class correspondente para você.

Page 5: Programação orientada a objetos no Visual Basic

6. Defina um campo particular para a classe adicionando o seguinte código entre as

instruções Class e End Class:

Visual Basic

Copiar Código

Private userNameValue As String

Declarar o campo como Private significa que ele pode ser usado somente dentro da

classe. Você pode disponibilizar campos de fora de uma classe usando modificadores de

acesso, como Public, que fornecem mias acesso. For more information, see Níveis de

acesso em Visual Basic.

7. Defina uma propriedade para a classe adicionando o seguinte código:

Visual Basic

Copiar Código

Public Property UserName() As String

Get

' Gets the property value.

Return userNameValue

End Get

Set(ByVal Value As String)

' Sets the property value.

userNameValue = Value

End Set

End Property

8. Defina um método para a classe adicionando o seguinte código:

Visual Basic

Copiar Código

Public Sub Capitalize()

' Capitalize the value of the property.

userNameValue = UCase(userNameValue)

End Sub

9. Defina um construtor com parâmetros para a nova classe adicionando um procedimento

denominado Sub New:

Visual Basic

Page 6: Programação orientada a objetos no Visual Basic

Copiar Código

Public Sub New(ByVal UserName As String)

' Set the property value.

Me.UserName = UserName

End Sub

O construtor Sub New é chamado automaticamente quando um objeto baseado nessa

classe é criado. Esse construtor define o valor do campo que contém o nome de usuário.

Para criar um botão para testar a classe

1. Altere o formulário de inicialização para o modo de design clicando com o botão direito em

seu nome no Gerenciador de Soluções e, em seguida, clicando em Designer de Modo

de Exibição. Por padrão, o formulário de inicialização para projetos de aplicativos

Windows é chamado Form1.vb. O formulário principal, em seguida, será exibido.

2. Adicione um botão ao formulário principal e clique duas vezes nele para exibir o código

para o manipulador de eventos Button1_Click. Adicione o seguinte código para chamar

o procedimento de teste:

Visual Basic

Copiar Código

' Create an instance of the class.

Dim user As New UserNameInfo("Moore, Bobby")

' Capitalize the value of the property.

user.Capitalize()

' Display the value of the property.

MsgBox("The original UserName is: " & user.UserName)

' Change the value of the property.

user.UserName = "Worden, Joe"

' Redisplay the value of the property.

MsgBox("The new UserName is: " & user.UserName)

Para executar seu aplicativo

1. Execute o aplicativo pressionando F5. Clique no botão do formulário para chamar o

procedimento de teste. Ele exibe uma mensagem informando que o UserName original é

"MOORE, BOBBY", porque o procedimento chama o método Capitalize do objeto.

2. Clique OK para descartar a caixa de mensagem. O procedimento Button1 Click altera o

valor da propriedade UserName e exibe uma mensagem informando que o novo valor de

UserName é "Worden, Joe".

Classes versus módulos

Page 7: Programação orientada a objetos no Visual Basic

Classes e módulos são tipos de referência que encapsulam os itens definidos dentro, mas eles diferem em como itens são acessados a partir de outros procedimentos.  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 recebe o mesmo valor se ler essa variável. Em contraste, dados do objeto existem separadamente para cada objeto instanciado. Outra diferença é que, ao contrário dos módulos padrão, classes podem implementar interfaces.

Observação:

Quando o Modificador de Shared é aplicado a um membro da classe, ele é associado com a classe propriamente dito, em vez de uma instância específica da classe. O membro é acessado diretamente usando o nome da classe, da mesma maneira que membros de módulo são acessados. Para obter mais informações sobre membros compartilhados, veja Membros compartilhados no Visual Basic.

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 apenas durante a vida útil 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, o 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 na realidade variáveis globais, pois estão visíveis de qualquer lugar em seu projeto, e existem durante a vida útil do programa.

Como objetos são criados e destruídos Outros recursosUma instância de uma classe, um objeto, é criado usando a palavra-chave New. Tarefas de inicialização geralmente devem ser executadas no novos objetos antes de serem usadas. Tarefas de inicialização ComComumComum Incluir Abrindo de arquivos, conectar a bancos de dados e ler valores de chaves do Registro. Visual Basic controla a inicialização de novos objetos usando procedimentos chamados construtores (métodos EEspecial que permitem o controle sobre a inicialização). Depois de Comum objeto sai do escopo, ela é lançada pelo ComComumComum Idioma Tempo de execução (CLR). Visual Basic controla o versãosão de recursos do sistema usando os procedimentos chamados destruidores. Juntos, construtores e destrutores oferecem suporte a criação de bibliotecas de classes robusta e previsível.  Sub Novo e Sub Finalize

O Sub New e procedimentos de Sub Finalize no Visual Basic inicializar e destruir objetos; eles Substituir a Class_Initialize e métodos de Class_Terminate usados no Visual Basic 6.0 e versões anteriores. Ao contrário de Class_Initialize, o construtor de Sub New pode executar apenas uma vez quando uma classe é Criado. Ele não pode ser chamado explicitamente em qualquer lugar diferente na Primeiro linha do código de outro construtor da qualquer classe mesma ou de uma classe derivada. Além disso, o código no método Sub New sempre será executado antes de qualquer outro código em uma classe. Visual Basic 2005 e versões posteriores implicitamente criar um construtor Sub New em tempo de execução se você não definir explicitamente um procedimento de Sub New para uma classe. Antes de liberar objetos, o CLR automaticamente chama o método Finalize de objetos que definem um procedimento de Sub Finalize. O método Finalize pode conter código que precisa executar imediatamente antes de um objeto é destruído, como o código para fechar arquivos e Salvando informações de estado. Há uma penalidade de desempenho pequeno para executar Sub Finalize, portanto, você deve definir um método Sub Finalize somente quando você precisa versão objetos explicitamente.

Observação:

O coletor de lixo do CLR não tem como (e não pode) finalizar objetos não gerenciados, objetos que o sistema operacional executa diretamente, fora do ambiente CLR. Isso ocorre porque diferentes objetos não gerenciados devem ser descartados de maneiras diferentes. Essa informação não está diretamente associada com o objeto não gerenciado; ele deve ser encontrado na documentação para o objeto. Uma classe que usa os objetos não gerenciados deve descarregá-los em seu método

Page 8: Programação orientada a objetos no Visual Basic

Finalize.

O destruidor Finalize é um método protegido que pode ser chamado somente da classe que ele pertence, ou de classes derivadas. O sistema chama Finalize automaticamente quando um objeto é destruído, portanto, você não deve chamar explicitamente Finalize de fora da implementação de Finalize uma classe derivada. Ao contrário de Class_Terminate, que será executada assim que um objeto é definido como nada, geralmente há um atraso entre quando um objeto perca escopo e quando o Visual Basic chama o destruidor Finalize. Visual Basic 2005 e versãosões posteriores permitem um segundo tipo de destruidor, Dispose, que pode ser explicitamente chamado a a qualquer hora para liberar imediatamente recursos.

Observação:

O Finalize, destruidor, não deve lançar exceções, pois eles não podem ser manipulados pelo aplicativo e podem fazer com que o aplicativo encerre.

 Interface IDisposable

Instâncias da classe geralmente Controlaram recursos não gerenciados pelo CLR, como identificadores do Windows e conexões de banco de dados. Esses recursos devem ser descartados no método Finalize de classe, para que eles serão liberados quando o objeto é destruído pelo coletor de lixo. No entanto, o coletor de lixo destrói objetos apenas quando o CLR requer mais memória livre. Isto significa que os recursos podem não ser liberados até muito tempo depois que o objeto sai do escopo. Para complementar o Garbage Collection, suas classes podem fornecem um mecanismo para gerenciar ativamente os recursos de sistema se eles implementam a interface de IDisposable. IDisposable tem um método, Dispose, o qual os clientes devem chamar quando terminarem de usar um objeto. Você pode usar o método Dispose para Eliminar imediatamente, liberar recursos e executar tarefas como fechar arquivos de dados e conexões. Ao contrário do destruidor Finalize , o método Dispose não é chamado automaticamente. Clientes de uma classe devem chamar explicitamente o Dispose  quando pretendem liberar imediatamente recursos. Implementação de IDisposableUma classe que implementa a interface de IDisposable deve incluir essas seções de código:

Um campo para controlar das se o objeto foi descartado:

Copiar Código

Protected disposed As Boolean = False

Uma sobrecarga de Dispose que libera recursos da classe. Este método deve ser chamado

pelo Dispose e métodos de Finalize da classe base:

Copiar Código

Protected Overridable Sub Dispose(ByVal disposing As Boolean)

If Not Me.disposed Then

If disposing Then

' Insert code to free managed resources.

End If

' Insert code to free unmanaged resources.

End If

Me.disposed = True

End Sub

Uma implementação de Dispose contém o seguinte código:

Page 9: Programação orientada a objetos no Visual Basic

Copiar Código

Public Sub Dispose() Implements IDisposable.Dispose

Dispose(True)

GC.SuppressFinalize(Me)

End Sub

Finalize um override do método que contém apenas o seguinte código:

Copiar Código

Protected Overrides Sub Finalize()

Dispose(False)

MyBase.Finalize()

End Sub

Derivando de uma classe que implementa IDisposableUma classe que deriva de uma classe base que implementa a interface de IDisposable não precisa substituir qualquer um dos métodos base a menos que ele use recursos adicionais que precisam ser descartados. Nessa situação, a classe derivada deve substituir método de Dispose(disposing) da classe base para Dispose de recursos da classe derivada. Este override deve chamar a classe base do Dispose (disposing) método

Copiar Código Protected Overrides Sub Dispose(ByVal disposing As Boolean) If Not Me.disposed Then If disposing Then ' Insert code to free managed resources. End If ' Insert code to free unmanaged resources. End If MyBase.Dispose(disposing)End SubA classe derivada não deve sobrepor os métodos Dispose e Finalize da classe base. Quando esses métodos são chamados de uma instância da classe derivada, implementação da classe base desses métodos chamar Substituir a classe derivada do método Dispose(disposing). VisualizaçãoO diagrama a seguir mostra quais métodos são herdados e quais métodos são substituídos na classe derivada.

Quando este Dispose e Finalize padrão é seguido, os recursos da classe derivada e a classe base são corretamente eliminados. A diagrama a seguir mostra quais métodos chamados quando as classes são descartadas e finalizadas.

Page 10: Programação orientada a objetos no Visual Basic

 Lixo coleção e Finalize Destructor

O .NET Framework usa o sistema de coleção de lixo (Garbage Collection) da referência de rastreamento para periodicamente liberar os recursos não utilizados. O Visual Basic 6.0 e versões anteriores usam um sistema diferente chamado referência de contagem para gerenciar recursos. Embora ambos os sistemas executem a mesma função automaticamente, existem algumas diferenças importantes. O CLR periodicamente destrói objetos quando o sistema determina que esses objetos não são mais necessários. Os objetos são liberados mais rapidamente quando recursos do sistema estão no fornecimento Abreviado e com menos freqüência caso contrário. O atraso entre quando um objeto perca escopo e quando o CLR libera ele significa que, ao contrário com objetos no Visual Basic 6.0 e versões anteriores, você não pode determinar exatamente quando o objeto será destruído. Em tais situações, objetos são considerados ter de vida útil de não-determinística . Na maioria dos casos, vida útil de não-determinística não Altera como escrever aplicativos, desde que você se lembre de que o destruidor Finalize não pode ser executado imediatamente quando um objeto perde o escopo. Outra diferença entre o lixo coleção (Garbage Collection) envolve o uso de Nothing. Para usufruir da contagem de referência no Visual Basic 6.0 e versões anteriores, os programadores atribuem às vezes, Nothing a variáveis de objeto para liberar as referências a essas variáveis. Se a variável realizada a última referência ao objeto, o objeto de recursos foram liberados imediatamente Em versões posteriores do Visual Basic, enquanto que pode haver casos em que este procedimento ainda seja valioso, desenvolvê-lo  nunca faz com que o objeto referenciado para liberar seus recursos seja de fato liberado imediatamente. Para liberar recursos imediatamente, use o método Dispose do objeto, se disponível. A única vez que você deve definir uma variável como Nothing é quando sua vida útil é tempo relativo para o tempo que o coletor de lixo leva para detectar objetos órfãos.

Como: Implementar o Dispose Finalize padrão (Visual Basic)The Dispose Finalize pattern ensures that resources are released when the object is no longer needed.  Exemplo

The ResourceClass class in the following example utilizes managed and unmanaged resources and then uses the Dispose Finalize pattern to dispose of them properly. Os recursos e suas funções são:

A implementação do método Dispose, que permite aos usuários da classe Dispose de

instâncias de classe. Este método chama Dispose(True) para Dispose de recursos do

objeto e, então, chama SuppressFinalize para impedir que o código de finalização

executando um segundo tempo.

A Substituir do método base Finalize, que permite que o ComComumComum Idioma

Tempo de execução (CLR) coletor de lixo Dispose de instâncias de classe. Este método

chama Dispose(False) para Dispose de recursos do objeto. Observe que se Dispose era

chamado anteriormente para o objeto, sua chamada SuppressFinalize poderia impedir o

coletor de lixo chamar o método Finalize.

A sobrecarga do método Dispose, que faz o trabalho de descarte. Leva um parâmetro

booleano, disposing, que indica se o seu código iniciadas alienação do objeto. Quando

você descartar um objeto, Tudo seus recursos devem ser descartados da. Quando o

coletor de lixo CLR descarta de um objeto, somente os recursos não gerenciados devem

ser descartados da; o coletor de lixo descarta automaticamente os recursos gerenciados

quando necessário.

Page 11: Programação orientada a objetos no Visual Basic

For more information, see Como objetos são criados e destruídos Outros recursos. Visual Basic

Copiar Código Public Class ResourceClass Implements IDisposable

Private managedResource As System.ComponentModel.Component Private unmanagedResource As IntPtr Protected disposed As Boolean = False

Public Sub New() ' Insert appropriate constructor code here. End Sub

Protected Overridable Overloads Sub Dispose( _ ByVal disposing As Boolean) If Not Me.disposed Then If disposing Then managedResource.Dispose() End If ' Add code here to release the unmanaged resource. unmanagedResource = IntPtr.Zero ' Note that this is not thread safe. End If Me.disposed = True End Sub

Public Sub AnyOtherMethods() If Me.disposed Then Throw New ObjectDisposedException(Me.GetType().ToString, _ "This object has been disposed.") End If End Sub

#Region " IDisposable Support " ' Do not change or add Overridable to these methods. ' Put cleanup code in Dispose(ByVal disposing As Boolean). Public Overloads Sub Dispose() Implements IDisposable.Dispose Dispose(True) GC.SuppressFinalize(Me) End Sub Protected Overrides Sub Finalize() Dispose(False) MyBase.Finalize() End Sub#End Region End ClassEste exemplo de código também está disponível como um trecho de código IntelliSense. No selecionador de trechos de código, ele está localizado em Visual Basic Language. Para obter mais informações, consulte HOW TO: Trechos Inserir em seu código (Visual Basic).  Compilando o código

Este exemplo requer: Acesso aos membros do espaços para nomes System e System.ComponentModel.

Adicione uma declaração Imports se você não está qualificando completamente os

nomes de membros em seu código. Para obter mais informações, consulte Declaração

Imports (Tipo e Namespace .NET).

Essas alterações devem ser feitas no código: Substituir ResourceClass com o nome da classe que implementa IDisposable.

Page 12: Programação orientada a objetos no Visual Basic

Use o teste no AnyOtherMethods em quaisquer métodos usando os recursos que podem

ter sido alienados.

Substituir a declaração de managedResource com declarações de qualquer gerenciados

objetos na sua classe que precisam ser descartados. Se uma classe implementa

IDisposable ou tem um método de Close, ele provavelmente precisará ser descartado.

No método de Dispose, fechar ou Dispose desses objetos.

Substituir a declaração de unManagedResource com declarações de objetos não

gerenciados em sua classe que precisam ser descartados. O método de descarte desses

objetos depende de como o objeto é definido. Para obter detalhes, consulte a

documentação no objeto.

 Programação robusta

Depois que tiver sido chamado o método Dispose, objetos contidos na sua coleção não será válidos. Você deve testar o campo disposed antes de executar quaisquer operações sobre o objeto. Para obter um exemplo, consulte o método AnyOtherMethods no exemplo de código.

Usando Construtores e DestrutoresConstrutores e destrutores controlam a criação e a destruição de objetos.  Construtores

Para criar um construtor para uma classe, crie um procedimento chamado Sub New em qualquer lugar na definição da classe. Para criar um construtor com parâmetros, especifique os nomes e tipos de dados dos argumentos para Sub New exatamente como você faria para qualquer outro procedimento, como no código a seguir: Visual Basic

Copiar Código Sub New(ByVal s As String)Os construtores são freqüentemente sobrecarregados, como no código a seguir: Visual Basic

Copiar Código Sub New(ByVal s As String, i As Integer)Quando você define uma classe derivada de outra classe, a primeira linha de um construtor deve ser uma chamada para o construtor da classe base, a menos que a classe base tenha um construtor acessível que não recebe parâmetros. Uma chamada para a classe base que contém o construtor acima, por exemplo, seria MyBase.New(s). Caso contrário, MyBase.New é opcional, e o tempo de execução Visual Basic chama implicitamente. Depois que você Gravar o código para chamar o construtor do objeto pai, você pode adicionar qualquer código de inicialização adicionais para o procedimento de Sub New. Sub New pode aceitar argumentos quando chamado como um construtor com parâmetros. Esses parâmetros são passados do procedimento que está chamando o construtor, por exemplo, Dim AnObject As New ThisClass(X).  Destructors

O código a seguir mostra como usar Dispose e Finalize para liberar recursos em um classe base.

Observação:

Você deve seguir as diretrizes para implementação IDisposable definir check-out no Como objetos são criados e destruídos Outros recursos.

Visual Basic

Copiar Código ' Design pattern for a base class. Public Class Base Implements IDisposable

' Keep track of when the object is disposed.

Page 13: Programação orientada a objetos no Visual Basic

Protected disposed As Boolean = False

' This method disposes the base object's resources. Protected Overridable Sub Dispose(ByVal disposing As Boolean) If Not Me.disposed Then If disposing Then ' Insert code to free managed resources. End If ' Insert code to free unmanaged resources. End If Me.disposed = True End Sub

#Region " IDisposable Support " ' Do not change or add Overridable to these methods. ' Put cleanup code in Dispose(ByVal disposing As Boolean). Public Sub Dispose() Implements IDisposable.Dispose Dispose(True) GC.SuppressFinalize(Me) End Sub Protected Overrides Sub Finalize() Dispose(False) MyBase.Finalize() End Sub#End Region End ClassO código a seguir mostra como usar Dispose e Finalize para liberar recursos em um classe base. Visual Basic

Copiar Código ' Design pattern for a derived class.Public Class Derived Inherits Base

' This method disposes the derived object's resources. Protected Overrides Sub Dispose(ByVal disposing As Boolean) If Not Me.disposed Then If disposing Then ' Insert code to free managed resources. End If ' Insert code to free unmanaged resources. End If MyBase.Dispose(disposing) End Sub

' The derived class does not have a Finalize method ' or a Dispose method with parameters because it inherits ' them from the base class.End ClassO código a seguir mostra um padrão de design comum para o destrutor Dispose , usando um bloco Using e um bloco Try...Finally equivalente. Visual Basic

Copiar Código Sub DemonstrateUsing() Using d As New Derived ' Code to use the Derived object goes here. End UsingEnd Sub

Sub DemonstrateTry() Dim d As Derived = Nothing

Page 14: Programação orientada a objetos no Visual Basic

Try d = New Derived ' Code to use the Derived object goes here. Finally ' Call the Dispose method when done, even if there is an exception. If Not d Is Nothing Then d.Dispose() End If End TryEnd SubO próximo exemplo cria um objeto usando um construtor com parâmetros e em seguida, chama destrutores quando o objeto não for mais necessário.

Observação:

Embora este exemplo use Collect para demonstrar os métodos que o coletor de lixo chamar Dispose métodos, em geral, você deve permitir que o ComComumComum Idioma Tempo de execução (CLR) Gerenciar lixo coleção.

Visual Basic

Copiar Código Sub TestConstructorsAndDestructors() ' Demonstrate how the Using statement calls the Dispose method. Using AnObject As New ThisClass(6) ' Place statements here that use the object. MsgBox("The value of ThisProperty after being initialized " & _ " by the constructor is " & AnObject.ThisProperty & ".") End Using

' Demonstrate how the garbage collector calls the Finalize method. Dim AnObject2 As New ThisClass(6) AnObject2 = Nothing GC.Collect()End Sub

Public Class BaseClass Sub New() MsgBox("BaseClass is initializing with Sub New.") End Sub

Protected Overrides Sub Finalize() MsgBox("BaseClass is shutting down with Sub Finalize.") ' Place final cleanup tasks here. MyBase.Finalize() End SubEnd Class

Public Class ThisClass Inherits BaseClass Implements IDisposable

Sub New(ByVal SomeValue As Integer) ' Call MyBase.New if this is a derived class. MyBase.New() MsgBox("ThisClass is initializing with Sub New.") ' Place initialization statements here. ThisPropertyValue = SomeValue End Sub

Private ThisPropertyValue As Integer

Page 15: Programação orientada a objetos no Visual Basic

Property ThisProperty() As Integer Get CheckIfDisposed() ThisProperty = ThisPropertyValue End Get Set(ByVal Value As Integer) CheckIfDisposed() ThisPropertyValue = Value End Set End Property

Protected Overrides Sub Finalize() MsgBox("ThisClass is shutting down with Sub Finalize.") Dispose(False) End Sub

' Do not add Overridable to this method. Public Overloads Sub Dispose() Implements IDisposable.Dispose MsgBox("ThisClass is shutting down with Sub Dispose.") Dispose(True) GC.SuppressFinalize(Me) End Sub

Private disposed As Boolean = False Public Sub CheckIfDisposed() If Me.disposed Then Throw New ObjectDisposedException(Me.GetType().ToString, _ "This object has been disposed.") End If End Sub

Protected Overridable Overloads Sub Dispose( _ ByVal disposing As Boolean) MsgBox("ThisClass is shutting down with the Sub Dispose overload.") ' Place final cleanup tasks here. If Not Me.disposed Then If disposing Then ' Dispose of any managed resources. End If ' Dispose of any unmanaged resource.

' Call MyBase.Finalize if this is a derived class, ' and the base class does not implement Dispose. MyBase.Finalize() End If Me.disposed = True End Sub

End ClassQuando você executa esse exemplo, a classe ThisClass chama o construtor Sub New da classe BaseClass. Depois que o construtor da classe base finalizar, a classe ThisClass executa as instruções restantes em Sub New que inicializam um valor para a propriedade ThisProperty. Quando a classe não for mais necessária, o destrutor Dispose é chamado em ThisClass. Este exemplo ilustra o seguinte: BaseClass is initializing with Sub New. ThisClass is initializing with Sub New. The value of ThisProperty after being initialized by the constructor is 6. ThisClass is shutting down with Sub Dispose. ThisClass is shutting down with the Sub Dispose overload. BaseClass is shutting down with Sub Finalize. BaseClass is initializing with Sub New.

Page 16: Programação orientada a objetos no Visual Basic

ThisClass is initializing with Sub New. ThisClass is shutting down with Sub Finalize. ThisClass is shutting down with the Sub Dispose overload. BaseClass is shutting down with Sub Finalize.

Propriedades de Classe, Campos e MétodosEm geral, os campos e propriedades representam informações sobre um objeto, enquanto os métodos representam ações que um objeto pode executar. Os tópicos a seguir descrevem os mecanismos para adicionar propriedades, campos e métodos classes e lidar com problemas associados com esses itens.  Nesta seção

Como: Adicionar campos e propriedades a uma classeFornece informações sobre como declarar campos e propriedades.

Propriedades e Procedimentos de PropriedadesExplica como procedimetos Property funcionam e como implementar tipos de propriedades comuns.

Propriedade procedimentos vs. CamposAjuda a decidir quando usar campos para armazenar dados em uma classe, e quando as propriedades são uma melhor opção.

Métodos de classeDescreve os procedimentos públicos que você adiciona à sua classe.

Propriedades vs. MétodosAjuda a decidir se a funcionalidade desejada é melhor implementada como uma propriedade ou um método.

Propriedades PadrãoDescreve as propriedades usadas quando nenhuma propriedade específica é chamada.

Propriedades e métodos sobrecarregadosDescreve como definir Múltiplo propriedades ou métodos com o mesmo nome, mas trabalhar com dados diferentes tipos.

Sobrescrevendo propriedades e métodosDiscute redefinir uma propriedade herdada ou método.

Como: Adicionar campos e propriedades a uma classeVocê pode usar Ambos campos e propriedades para armazenar informações em um objeto. Embora os campos e propriedades sejam quase indistinguíveis da perspectiva do aplicativo cliente, elas são declaradas diferente dentro de uma classe. Enquanto os campos são variáveis Público simplesmente que expõe uma classe, o propriedades usar Property procedimentos para controlar como os valores serão definidos ou retornados.

Para adicionar um campo a uma classe

Declare uma variável Público na definição de classe, como no código a seguir:

Visual Basic

Copiar Código

Class ThisClass

Public ThisField As String

End Class

Para adicionar uma propriedade para uma classe

1. Declare uma variável local dentro da classe para armazenar o valor da propriedade. Esta

etapa é necessária porque propriedades não alocar qualquer armazenamento por conta

Page 17: Programação orientada a objetos no Visual Basic

própria. Para proteger seus valores contra modificação direta, variáveis usadas para

armazenar valores de propriedade devem ser declarados como Private.

2. Iniciar declarações de propriedade com modificadores, como Public e Shared, conforme

apropriado. Use a palavra-chave Property declare o nome da propriedade e declare o

tipo de dados que a propriedade armazena e retorna.

3. Defina Get e Set procedimentos de propriedade dentro da definição de propriedade.

Procedimentos de propriedade Get são usados para retornar o valor de uma propriedade

e são basicamente equivalente para funções na sintaxe. Eles aceitam sem argumentos e

podem ser usados para retornar o valor de particulares variáveis Local declaradas dentro

da classe usada para armazenar o valor da propriedade. Procedimentos de propriedade

Set são usados para definir o valor de uma propriedade; eles têm um parâmetro,

normalmente chamado Value, com o mesmo tipo de dados como a propriedade

propriamente dito. Sempre que o valor da propriedade é alterado, Value é passado para o

procedimento de propriedade Set, onde ele pode ser validado e armazenado em uma

variável local.

4. Encerrar Get e procedimentos de propriedade de Set com End Get e End Set instruções

conforme apropriado.

5. Encerrar o Bloquear de propriedade com uma instrução de End Property.

Observação:

Se você estiver trabalhando na Visual Studio ambiente de desenvolvimento integrado (IDE), você pode direcioná-la a fim de criar Vazio Get e os procedimentos de propriedade Set. Type Property PropName As DataType (where PropName is the name of your property, and DataType is a specific data type, such as Integer), and the property procedures appear in the Code Editor.

6. O exemplo a seguir declara uma propriedade em uma classe:

7. Visual Basic

8.

9. Copiar Código

10. Class ThisClass

11. Private m_PropVal As String

12. Public Property One() As String

13. Get

14. ' Return the value stored in the local variable.

15. Return m_PropVal

16. End Get

17. Set(ByVal Value As String)

18. ' Store the value in a local variable.

19. m_PropVal = Value

20. End Set

21. End Property

22. End Class

23. Quando você cria uma instância de ThisClass e define o valor da propriedade One, o

procedimento Set da propriedade é chamado e o valor é passado no parâmetro Value, que

é armazenado em um variável local denominado m_PropVal. Quando o valor da

propriedade é recuperado, o procedimento Get da propriedade é chamado como uma

função e retorna o valor armazenado na variável local m_PropVal.

Page 18: Programação orientada a objetos no Visual Basic

Propriedades e Procedimentos de PropriedadesVocê pode usar as propriedades e campos para armazenar informações em um objeto. Enquanto os campos são simplesmente variáveis públicas, propriedades usam procedimentos de propriedade para controlar como os valores são definidos ou retornados. Procedimentos de propriedades são blocos de código declarados dentro de definições de propriedade que você pode usar para executar código quando um valor da propriedade é definido ou recuperado. Visual Basic tem dois tipos de procedimentos de propriedade: os procedimentos de propriedade Get para recuperar um valor de propriedade e os procedimentos de propriedade Set para atribuir um valor a uma propriedade. Por exemplo, uma propriedade que armazena o saldo de uma conta bancária pode usar código em um procedimento de propriedade Get para postar juros e verificar taxas de serviço antes de retornar o saldo disponível. Você poderia então utilizar um procedimento de propriedade Set para validar o saldo e impedir que ele seja atualizado incorretamente. Resumindo, procedimento de propriedade permitem a um objeto proteger e validar seus próprios dados. O fragmento de código a seguir compara como campos e propriedades validam valores. Visual Basic

Copiar Código Protected Sub TestFieldsAndProperties() ' Assume, for this example, that the only valid values for ' the field and property are numbers less than 10. Dim NewClass As New ThisClass

' Test data validation.

' Works because there is no data validation. NewClass.ThisField = 36 ' Will print 36. MsgBox("ThisField = " & NewClass.ThisField)

' The attempt to set the field to a value greater than 10 will silently fail. NewClass.ThisProperty = 36 ' The next statement will print the old value of 0 instead. MsgBox("ThisProperty = " & NewClass.ThisProperty)End Sub

Public Class ThisClass ' Declare a field. Public ThisField As Integer ' Field used for Property Set operations. Private thisPropertyValue As Integer = 0 ' Declare a property. Public Property ThisProperty() As Integer Get Return thisPropertyValue End Get Set(ByVal Value As Integer) ' Only allow Set operation for values less than 10. If Value < 10 Then thisPropertyValue = Value End Set End PropertyEnd ClassO procedimento TestFieldsAndProperties cria uma instância da classe e define e recupera os valores dos campos e propriedades. Por questão de neste exemplo, presume-se que os valores somente válidos são números Menoses do que 10. Porque existe nenhuma maneira para validar os valores atribuídos aos campos, Configuração o campo valor 36 é permitido. A propriedade, no entanto, somente executa Atribuição para números menores do que 10, portanto, a tentativa para defini-la para 36 é ignorada.  Propriedades somente leitura e somente gravação

A maioria das propriedades possuem os procedimentos de propriedade Get e Set , que você pode usar para ler e modificar o valor armazenado. No entanto, você pode usar os modificadores ReadOnly ou WriteOnly para evitar que propriedades sejam modificadas ou lidas.

Page 19: Programação orientada a objetos no Visual Basic

Propriedades somente leitura não podem ter procedimento de propriedade Set; tais propriedades são úteis para itens que você deseja expor, mas não permite que sejam modificados. Por exemplo, você pode usar uma propriedade somente leitura para fornecer a velocidade do processador de um computador. Propriedades somente gravação não podem ter procedimentos de propriedade Get e são úteis para configurar objetos com dados que não devem ou não podem ser armazenados no objeto. Por exemplo, uma propriedade somente gravação pode ser usada para pegar uma senha e alterar o estado do objeto sem armazenar a senha.

Observação:

Versões anteriores do Visual Basic suporte Let propriedade procedimentos para uso ao atribuir a objetos em Propriedades. Visual Basic elimina a necessidade para Let procedimentos de propriedade porque o objeto atribuição é tratada como qualquer outro tipo de atribuição.

Propriedade procedimentos vs. CamposPropriedades e campos Ambos armazenar e recuperar informações em um objeto. Sua semelhança pode dificultar a determinar qual é a melhor opção programação em um maiúscminúsc de determinado. Use os procedimentos de propriedade quando:

Você precisa controlar quando e como um valor é definido ou recuperado.

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

Configuração o valor causa alguma Alterar perceptível no estado do objeto, como uma

propriedade IsVisible.

Configuração a propriedade faz com que as alterações Outro variáveis internas ou para os

valores das Outro propriedades.

Um conjunto de etapas deve ser executado antes que a propriedade pode ser definida ou

recuperada.

Use campos quando: O valor é de um tipo self-validating. Por exemplo, um erro ou conversão de dados

Automático ocorre se um valor Outro que True ou False é atribuído a uma variável

Boolean.

Qualquer valor no intervalo de suporte para o tipo de dados é válido. Isso é verdadeiro de

muitos propriedades do tipo Single ou Double.

A propriedade é um tipo de dados String, e não há nenhuma restrição no tamanho ou

valor da Cadeia de Caracteres de.

Métodos de classeOs métodos de uma classe são somente procedimentos Sub ou Function declarados dentro da classe. Por exemplo, para criar um método Withdrawalde uma classe denominada Account, você poderia adicionar essa função Public ao módulo de classe: Visual Basic

Copiar Código Public Function WithDrawal(ByVal Amount As Decimal, _ ByVal TransactionCode As Byte) As Double ' Add code here to perform the withdrawal, ' return a transaction code, ' or to raise an overdraft error.End Function Métodos compartilhados

Métodos compartilhados podem ser chamados diretamente da classe sem primeiro criar uma instância da classe. Métodos compartilhados são úteis quando você não deseja um método a ser associado uma instância específica de uma classe. Métodos compartilhados não podem ser declarados usando os modificadores Overridable, NotOverridable, ou MustOverride. Métodos

Page 20: Programação orientada a objetos no Visual Basic

declarados em módulos são implicitamente compartilhados e não é possível usar o modificador Shared explicitamente. ExemploVisual Basic

Copiar Código Class ShareClass Shared Sub SharedSub() MsgBox("Shared method.") End SubEnd Class

Sub Test() ' Call the method. ShareClass.SharedSub()End Sub Protegendo detalhes de implementação

Procedimentos utilitários que são usados internamente por uma classe devem ser declarados como Private,Protected, ou Friend. Restringir a acessibilidade de tais métodos protege os desenvolvedores que usam os objetos, permitindo que seja possível fazer alterações futuras sem afetar o código que utiliza os objetos. Proteger os detalhes da implementação de um objeto é outro aspecto do encapsulamento . Encapsulamento permite que você melhorar o desempenho dos métodos, ou alterar completamente a maneira como o método é implementado, sem ter de alterar o código que utiliza o método.

Propriedades vs. MétodosPropriedades e métodos são similares no fato de que ambos são implementados como procedimentos que aceitam argumentos. Em geral, propriedades armazenam dados para um objeto, o métodos são ações as quais pode ser requisitado a um objeto que realize. Algumas características de objeto são obviamente propriedades, como Name, e algumas são obviamente métodos, como Move e Show. Em outros casos, não é óbvio quais membros de classe devam ser propriedades e quais devam ser métodos. Por exemplo, o método Item de uma classe de coleção armazena e recupera dados e pode ser implementado como uma propriedade indexada. Por outro lado, é também razoável implementar Item como um método.  Propriedade sintaxe vs.Sintaxe do método

Um modo de se decidir como implementar um membro de classe é considerar como você deseja que ele seja usado. Embora a sintaxe para recuperar informações de uma propriedade parametrizada seja idêntica à sintaxe usada com um método implementado como uma função, a sintaxe para modificar tal valor é ligeiramente diferente. Por exemplo, se você implementar o membro de uma classe como uma propriedade, a sintaxe a seguir descreve como ele deve ser usado: ThisObject.ThisProperty(Index) = NewValue Se você implementar o membro de classe como um método, então o valor que está sendo modificado precisa ser um argumento. O fragmento de código a seguir descreve o uso equivalente de sintaxe: ThisObject.ThisProperty(Index, NewValue)  Mensagens de erro

Outro fator a se considerar quando se escolhe como implementar um membro de classe é que tipo de mensagens será gerado quando sua classe for usada incorretamente. Se alguém tenta acidentalmente designar um valor a uma propriedade somente-leitura, uma mensagem de erro é retornada diferente da resposta para uma chamada similar a um método. Membros de classe implementados corretamente retornam mensagens de erro que são fáceis de se interpretar.

Propriedades PadrãoUma propriedade que aceita argumentos pode ser declarada como a propriedade padrão para uma classe. Uma propriedade padrão é a propriedade que o Visual Basic usará quando nenhuma propriedade específica for denominada para um objeto. Propriedades padrão são úteis porque elas permitem que você faça seu código-fonte mais compacto, omitindo nomes de propriedades usados com freqüência.

Page 21: Programação orientada a objetos no Visual Basic

Os melhores candidatos para propriedades padrão são as propriedades que aceitam parâmetros e que você acha que serão usadas com mais freqüência. Por exemplo, a propriedade Item é uma boa opção para a propriedade padrão de uma classe coleção porque é usada com freqüência. As seguintes regras se aplicam às propriedades padrão:

Um tipo pode ter apenas uma propriedade padrão, incluindo propriedades herdadas de

um classe base. Há uma exceção a essa regra. Uma propriedade padrão definida em um

classe base pode ser sombreada por outra propriedade padrão em um classe derivada.

Se uma propriedade padrão de uma classe base é sombreada por uma propriedade que

não seja padrão, em um classe derivada, a propriedade padrão ainda será acessível

usando a sintaxe da propriedade padrão.

Uma propriedade padrão não pode ser Shared ou Private.

Se uma propriedade sobrecarregada for uma propriedade padrão, todas as propriedades

padrão como o mesmo nome também deverão especificar Default.

As propriedades padrão devem aceitar pelo menos um argumento.

 Exemplo

O exemplo a seguir declara uma propriedade que contém uma matriz de seqüências de caracteres como a propriedade padrão para uma classe: Visual Basic

Copiar Código Class Class2 ' Define a local variable to store the property value. Private PropertyValues As String() ' Define the default property. Default Public Property Prop1(ByVal Index As Integer) As String Get Return PropertyValues(Index) End Get Set(ByVal Value As String) If PropertyValues Is Nothing Then ' The array contains Nothing when first accessed. ReDim PropertyValues(0) Else ' Re-dimension the array to hold the new element. ReDim Preserve PropertyValues(UBound(PropertyValues) + 1) End If PropertyValues(Index) = Value End Set End PropertyEnd Class Acessando Propriedades Padrão

Você pode acessar as propriedades padrão usando a sintaxe abreviada. Por exemplo, o fragmento de código a seguir usa o padrão e a sintaxe da propriedade padrão: Visual Basic

Copiar Código Dim C As New Class2' The first two lines of code access a property the standard way.

' Property assignment.C.Prop1(0) = "Value One"' Property retrieval.MsgBox(C.Prop1(0))

' The following two lines of code use default property syntax.

' Property assignment.C(1) = "Value Two"

Page 22: Programação orientada a objetos no Visual Basic

' Property retrieval.MsgBox(C(1))

Propriedades e métodos sobrecarregadosSobrecarga é a criação de mais de um procedimento, construtor de instância ou propriedade em uma classe com o mesmo nome mas tipos de argumento diferente.  Sobrecarga de uso

Sobrecarga é especialmente útil quando o seu modelo de objeto determina que você utilizar nomes idênticos para procedimentos que operam em diferentes tipos de dados. Por exemplo, uma classe que pode exibir vários tipos de dados diferentes poderia ter procedimentos Display que esta aparência: Visual Basic

Copiar Código Overloads Sub Display(ByVal theChar As Char) ' Add code that displays Char data.End SubOverloads Sub Display(ByVal theInteger As Integer) ' Add code that displays Integer data.End SubOverloads Sub Display(ByVal theDouble As Double) ' Add code that displays Double data.End SubSem a sobrecarga, você precisará criar nomes distintos para cada procedimento, mesmo que eles fazem o mesmo, conforme mostrado Avançar: Visual Basic

Copiar Código Sub DisplayChar(ByVal theChar As Char) ' Add code that displays Char data.End SubSub DisplayInt(ByVal theInteger As Integer) ' Add code that displays Integer data.End SubSub DisplayDouble(ByVal theDouble As Double) ' Add code that displays Double data.End SubSobrecarga torna mais fácil usar propriedades ou métodos porque ele fornece uma variedade de tipos de dados que podem ser usados. Por exemplo, o método sobrecarregado Display discutido anteriormente pode ser chamado com qualquer uma das linhas de código a seguir: Visual Basic

Copiar Código ' Call Display with a literal of type Char.Display("9"c)' Call Display with a literal of type Integer.Display(9)' Call Display with a literal of type Double.Display(9.9R)Em tempo de execução, Visual Basic chama o procedimento correto com base nos tipos dados dos parâmetros que você especificar.

Observação:

Sobrecarga, substituição e sombreamento são conceitos similares que podem ser facilmente confundidos. Para obter mais informações, consulte Introdução a Objetos no Visual Basic.

 Sobrecarga de regras

Você criar um membro sobrecarregado para uma classe adicionando dois ou mais propriedades ou métodos com o mesmo nome. Exceto para membros derivados sobrecarregados, cada membro sobrecarregado deve ter listas de parâmetros diferentes, e os itens a seguir não podem ser usados como um diferenciador recurso quando a sobrecarga de uma propriedade ou um procedimento:

Page 23: Programação orientada a objetos no Visual Basic

Modificadores, como ByVal ou ByRef, que Aplicar para um membro ou parâmetros de

membro.

Nomes de parâmetros

Tipos de procedimentos de retorno

A palavra-chave Overloads é opcional durante sobrecarga, mas se nenhum membro sobrecarregado usa a palavra-chave Overloads, em seguida, Tudo outros membros sobrecarregados com o mesmo nome devem também especificar esta palavra-chave. Classes derivadas podem sobrecarregar membros herdados com membros que possuem parâmetros idênticos e tipos de parâmetro, um processo conhecido como sombreamento por nome e assinatura. Se a palavra-chave Overloads é usada quando sombreamento por nome e assinatura, implementação da classe derivada de membro será ser usada em vez da implementação da classe base e Tudo as Outro sobrecargas para esse membro estarão disponíveis para instâncias da classe derivada. Se a palavra-chave Overloads for omitida quando um membro herdado com um membro que tenha parâmetros idênticos e tipos de parâmetro de sobrecarga, em seguida, a sobrecarga será denominado sombreamento pelo nome. Sombreamento pelo nome, substitui a implementação herdada de um membro, e torna Tudo as Outro sobrecargas indisponível para instâncias de classe derivada e seus decedents. O Overloads e Shadows modificadores não podem Ambos ser usado com a mesma propriedade ou método. ExemploO exemplo a seguir cria métodos sobrecarregados que aceitar um String ou representação de Decimal de um valor em moeda corrente e retornar uma Cadeia de Caracteres contendo o imposto sobre vendas.

Para usar esse exemplo para criar um método sobrecarregado

1. Abrir um novo projeto e adicionar uma classe chamada TaxClass.

2. Adicione o seguinte código à classe TaxClass:

Visual Basic

Copiar Código

Public Class TaxClass

Overloads Function TaxAmount(ByVal decPrice As Decimal, _

ByVal TaxRate As Single) As String

TaxAmount = "Price is a Decimal. Tax is $" & _

(CStr(decPrice * TaxRate))

End Function

Overloads Function TaxAmount(ByVal strPrice As String, _

ByVal TaxRate As Single) As String

TaxAmount = "Price is a String. Tax is $" & _

CStr((CDec(strPrice) * TaxRate))

End Function

End Class

3. Adicionar o procedimento a seguir ao seu formulário.

Visual Basic

Page 24: Programação orientada a objetos no Visual Basic

Copiar Código

Sub ShowTax()

' 8% tax rate.

Const TaxRate As Single = 0.08

' $64.00 Purchase as a String.

Dim strPrice As String = "64.00"

' $64.00 Purchase as a Decimal.

Dim decPrice As Decimal = 64

Dim aclass As New TaxClass

'Call the same method with two different kinds of data.

MsgBox(aclass.TaxAmount(strPrice, TaxRate))

MsgBox(aclass.TaxAmount(decPrice, TaxRate))

End Sub

4. Adicionar um botão para seu formulário e a chamada a procedimento ShowTax do evento

Button1_Click do botão.

5. Executar o projeto e clique no botão no formulário para testar o procedimento

sobrecarregado ShowTax.

Em tempo de execução, o compilador escolhe a função sobrecarregada apropriada que corresponde aos parâmetros sendo usados. Quando você Clique o botão, o método sobrecarregado é chamado pela primeira vez com um parâmetro de Price que é uma Cadeia de Caracteres e a mensagem, "preço é uma Cadeia de Caracteres. Imposto é $ 5.12" é exibida. TaxAmount é chamado com um valor de Decimal a segundo tempo e a mensagem, "preço é um decimal. Imposto é $ 5.12" é exibida.

Sobrescrevendo propriedades e métodosUm classe derivada herda as propriedades e métodos definidos no sua classe base. Isso é útil porque você pode reutilizar esses itens quando apropriado para a classe derivada. Se a propriedade ou método no classe base é marcado com a palavra-chave Overridable, você pode definir uma nova implementação para o membro a classe derivada. Use a palavra-chave Overrides para sombrear o membro redefinindo-o na classe derivada. Isso é útil quando você não pode usar o membro da forma que está. Na prática, membros substituídos são geralmente usados para implementar polimorfismo. Para obter mais informações, consulte Polimorfismo. As seguintes regras se aplicam a métodos substituintes.

Você pode substituir somente os membros que são marcados com a palavra-chave

Overridable em suas classe base.

Por padrão, propriedades e métodos são NotOverridable.

Membros substituídos devem ter os mesmos argumentos como os membros herdados a

partir de classe base.

A nova implementação de um membro pode chamar a implementação original na classe

pai especificando MyBase antes do nome do método.

Observação:

Sobrecarga, substituição e sombra são conceitos semelhantes que podem ser fáceis de confundir. Para obter mais informações, consulte Introdução a Objetos no Visual Basic.

 Exemplo

Suponha que você queira definir classes para tratar a folha de pagamento. Você pode definir uma classe Payroll genérica que contém um método RunPayroll que calcula da folha de pagamento de uma semana típica. Você poderia então utilizar Payroll como uma classe base de uma classe BonusPayroll mais especializada, que pode ser usada ao distribuir bônus aos funcionários. A classe BonusPayroll pode herdar e substituir, o método PayEmployee definido na classe base Payroll.

Page 25: Programação orientada a objetos no Visual Basic

O exemplo a seguir define uma classe base, Payroll, e um classe derivada, BonusPayroll, que substitui um método PayEmployee herdado. Um procedimento, RunPayroll, cria e, em seguida, passa um objeto Payroll e um objeto BonusPayroll para uma função, Pay,que executa o método PayEmployee dos dois objetos. Visual Basic

Copiar Código Const BonusRate As Decimal = 1.45DConst PayRate As Decimal = 14.75D

Class Payroll Overridable Function PayEmployee( _ ByVal HoursWorked As Decimal, _ ByVal PayRate As Decimal) _ As Decimal

PayEmployee = HoursWorked * PayRate End FunctionEnd Class

Class BonusPayroll Inherits Payroll Overrides Function PayEmployee( _ ByVal HoursWorked As Decimal, _ ByVal PayRate As Decimal) _ As Decimal

' The following code calls the original method in the base ' class, and then modifies the returned value. PayEmployee = MyBase.PayEmployee(HoursWorked, PayRate) * BonusRate End FunctionEnd Class

Sub RunPayroll() Dim PayrollItem As Payroll = New Payroll Dim BonusPayrollItem As New BonusPayroll Dim HoursWorked As Decimal = 40

MsgBox("Normal pay is: " & _ PayrollItem.PayEmployee(HoursWorked, PayRate)) MsgBox("Pay with bonus is: " & _ BonusPayrollItem.PayEmployee(HoursWorked, PayRate))End Sub

Coleções em Visual BasicEm termos gerais, uma coleção é um objeto usado para agrupar e gerenciar objetos relacionados. Por exemplo, todo Form possui uma coleção de controles. (Você pode acessar essa coleção através do formulário de prorpiedade Controls.) Essa coleção é um objeto que representa todos os controles naquele formulário formulário. Ele permite que você recupere um controle na coleção por seu índice, percorra os elementos da coleção usando um For each... Avançar instrução (Visual Basic) . No entanto, existem vários tipos de coleções, e diferem uns dos outros de várias maneiras.  Diferentes tipos das coleções

Visual Basic também fornece uma classe Collection, com o qual você pode definir e criar suas próprias coleções. Como uma coleção Controls do formulário, a classe Collection também fornece a funcionalidade interna para repetir elementos usando For Each... Next e para recuperar os elementos pelo índice. For more information, see Objetos de Coleção (Visual Basic). No entanto, os dois tipos de coleções não interagem uns com os outros. Por exemplo, o código a seguir gera um erro do compilador. Dim localControls As Collection

Page 26: Programação orientada a objetos no Visual Basic

' The following line generates a COMPILER ERROR. localControls = Me.Controls() As coleções são incompatíveis porque a coleção Controls é uma coleção .NET Framework, enquanto a variável localControls é um Visual Basic Collection. Os dois tipos de coleções são implementados a partir de classes diferentes. Seus métodos são semelhantes, mas não idênticos, e seus esquemas indexação são diferentes.  Coleções de base zero e base um.

Uma coleção pode ser com base nula ou com base em um, dependendo no que está o seu índice inicial. A significa anterior que o índice do primeiro item na coleção é 0 e os meios última que ele é 1. An example of a zero-based collection is the .NET Framework Controls collection, discussed earlier on this page. O objeto Visual Basic Collection é um exemplo de uma coleção com base em um. Coleções com base em um podem ser mais intuitivas para Visual Basic Usuários, porque o índice varia de 1 ao valor da Propriedades de Contagem ( Objeto de coleção)., que retorna o número de itens em uma coleção. O índice de uma coleção com base zero, por outro lado, varia de 0 por meio de um menor que o valor da propriedade Count. Isso pode ser apropriado quando os valores de índice são deslocamentos de um valor de base ou correspondem aos membros de uma enumeração baseada em zero. Coleções .NET Framework são baseadas em zero com o objetivo de padronização. A classe Visual Basic Collection é baseada em um para fins de compatibilidade com versões anteriores.  Índices e valores chave

As instâncias da classe Visual Basic Collection permitem que você acesse um item usando um índice numérico ou uma String chave. Você pode adicionar itens aos objetos Visual Basic Collection especificando ou não uma chave. Se você adicionar um item sem uma chave, você deve usar seu índice numérico para acessá-lo. Por outro lado, coleções como System.Collections..::.ArrayList permitem apenas um índice numérico. Não é possível associar as chaves com os elementos dessas coleções, a menos que você crie seu próprio mapeamento com base, por exemplo, em uma matriz String pressionando as teclas.  Adicionando e removendo itens

Coleções também diferem em se ou não você pode adicionar itens a elas e em caso afirmativo, como esses itens são adicionados. Como o objeto Visual Basic Collection é uma ferramenta de programação de uso geral, é mais flexível do que algumas outras coleções. Ele tem um Adicionar método (coleção Objeto) para colocar Itens em coleção e um Método Remove (Objeto Coleção) para retirar itens fora. Certas coleções especializadas, por outro lado, não permitem que você adicione ou remova elementos usando código. Por exemplo, a propriedade CheckedListBox..::.CheckedItems retorna uma coleção de referências a itens pelo índice, mas seu código não pode adicionar ou remover itens da coleção. Somente o usuário pode fazer isso — ao marcar ou desmarcar a caixa apropriada na interface do usuário. Assim não há nenhum Add ou método Remove para esta coleção.

Eventos no Visual BasicUm evento é uma mensagem enviada por um objeto anunciando que algo ocorreu. Eventos são implementados utilizando delegados, uma forma de ponteiro de função orientado a objeto, que permite que uma função seja invocada indiretamente por meio de uma referência à função.  Nesta seção

Eventos e manipuladores de eventosProporciona uma visão geral de eventos, manipuladores de evento, e da terminologia associada.

WithEvents e Cláusula HandlesDemonstra como usar a palavra-chave WithEvents e a cláusula Handles para associar um evento com um manipulador de evento.

AddHandler e RemoveHandlerDemonstra como usar as declarações AddHandler e RemoveHandler para associar dinamicamente um evento com um manipulador de evento.

Como: Adicionar eventos a uma classeDescreve o processo de definição de eventos.

Como: Criar manipuladores de eventos no Editor de código do Visual BasicFornece instruções para uso do Visual Basic Code Editor para escrever código para responder a eventos.

Como: Elevar um evento (Visual Basic)Demonstra como definir um evento e usa a instrução RaiseEvent para fazer com que o evento ocorra

Como: Criar um evento e o manipulador (Visual Basic)

Page 27: Programação orientada a objetos no Visual Basic

Demonstra como definir um evento e um manipulador de eventos, e usa a instrução AddHandler para associá-los.

Como: Gravar Eventos manipuladoresDemonstra como escrever manipuladores de evento usando a cláusula Handles ou a declaração AddHandler.

Como: Manipular eventos no Visual BasicDefine uma classe que lança um evento quando o método CauseEvent é chamado.

Demonstra Passo a passo: Declarando e disparando eventos Fornece uma descrição passo a passo de como declare e disparar eventos de uma classe.

Demonstra Passo a passo: Tratamento de eventosDemonstra como escrever um procedimento de manipulador de eventos.

Como: declare eventos que evitar o bloqueioDemonstra como definir um evento personalizado que permite que seus manipuladores de evento sejam chamados assincronamente.

Como: declare eventos que conservar o uso de memóriaDemonstra como definir um evento personalizado que utiliza a memória somente quando o evento é manipulado.

Solução de problemas herdados manipuladores de eventos no Visual BasicLista problemas comuns que surgem com manipuladores evento nos componentes herdados

Eventos e manipuladores de eventosEnquanto você pode visualizar um projeto Visual Studio como uma série de procedimentos que executam em uma seqüência, na realidade, a maioria dos programas são orientados a eventos — o que significa que o fluxo de execução é determinado pelas externas ocorrências chamadas eventos. Um evento é um sinal que informa a um aplicativo que algo importante ocorreu. Por exemplo, quando um usuário clica em um controle em um formulário, o formulário pode lançar um evento Click e chamar um procedimento que manipula o evento. Eventos também permitem que tarefas separadas se comuniquem. Digamos que, por exemplo, seu aplicativo execute uma tarefa de classificação separadamente do aplicativo principal. Se um usuário cancelar a classificação, o aplicativo pode enviar um evento Cancelar instruindo o processo de classificação para parar.  Termos e Conceitos de Evento

Esta seção descreve os termos e conceitos usados com eventos em Visual Basic. Declarando EventosVocê declara eventos dentro de classes, estruturas, módulos e interfaces usando a palavra-chave Event, como no exemplo a seguir: Visual Basic

Copiar Código Event AnEvent(ByVal EventNumber As Integer)Disparando EventosUm evento é como uma mensagem anunciando que algo importante ocorreu. O ato de transmitir a mensagem é chamado Disparo de evento. Em Visual Basic,você dispara eventos com a instrução RaiseEvent, como no exemplo a seguir: Visual Basic

Copiar Código RaiseEvent AnEvent(EventNumber)Eventos devem ser disparados dentro do escopo da classe, módulo ou estrutura onde eles são declarados. Por exemplo, um classe derivada não pode disparar eventos herdados de um classe base. Remetentes de EventoQualquer objeto capaz de dispara um evento é um Remetente de Evento,também conhecido como uma fonte de evento. Formulários, controles e objetos definidos pelo usuário são exemplos de remetentes de eventos. Manipuladores de EventosManipuladores de eventos são procedimentos que são chamados quando ocorre um evento correspondente. Você pode usar qualquer sub-rotina válida com uma assinatura correspondente como um manipulador de eventos. Entretanto, você não pode usar uma função como um manipulador de eventos, porque ela não retorna um valor para a fonte de eventos. Visual Basic usa uma convenção de nomeclatura padrão para manipuladores de eventos que combina o nome do remetente do evento, um sublinhado e o nome do evento. Por exemplo, o evento Click de um botão chamado button1 será nomeado Sub button1_Click.

Page 28: Programação orientada a objetos no Visual Basic

Observação:

Recomendamos que você use esta convenção de nomeclatura quando definir manipuladores de eventos para seus próprios eventos, mas ela não é necessário; você pode usar qualquer nome de sub-rotina válido.

Associando Eventos Manipuladores de EventosAntes uma manipulador de eventos se tornar útil, você deve primeiro associá-lo com um evento usando uma instrução Handles ou AddHandler. A instrução WithEvents e a cláusula Handles fornecem uma maneira declarativa de especificar os manipuladores de eventos. Eventos disparados por um objeto declarado com WithEvents podem ser tratados por qualquer sub-rotina com uma cláusula Handles que nomeie este evento. Embora a cláusula Handles seja a maneira padrão de associar um manipulador de eventos com um evento, é limitada ao associar eventos com manipuladores de eventos em tempo de compilação. As instruções AddHandler e RemoveHandler são mais flexíveis do que a cláusula Handles. Eles permitem que você dinamicamente conecte e desconecte os eventos de um ou mais manipuladores de eventos em tempo de execução, e não requerem que você declare variáveis de objeto usando WithEvents. No entanto, há algumas restrições ao usar WithEvents. Para obter mais informações, consulte WithEvents e Cláusula Handles. Em alguns casos, como com os eventos associados com os formulários ou controles, Visual Basic automaticamente extingue um manipulador de eventos em branco e o associa com um evento. Por exemplo, quando você clica duas vezes em um botão de comando em um formulário no modo de design, Visual Basic cria um manipulador de eventos em branco e uma variável WithEvents para o botão de comando, como no código a seguir: Visual Basic

Copiar Código Friend WithEvents Button1 As System.Windows.Forms.ButtonProtected Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.ClickEnd Sub

WithEvents e Cláusula HandlesA instrução WithEvents e a cláusula Handles fornecem uma maneira declarativa de especificar os manipuladores de eventos. Um evento gerado por um objeto declarado com a palavra-chave WithEvents pode ser tratado por qualquer procedimento com uma instrução Handles para esse evento, conforme mostrado no exemplo o seguir: Visual Basic

Copiar Código ' Declare a WithEvents variable.Dim WithEvents EClass As New EventClass

' Call the method that raises the object's events.Sub TestEvents() EClass.RaiseEvents()End Sub

' Declare an event handler that handles multiple events.Sub EClass_EventHandler() Handles EClass.XEvent, EClass.YEvent MsgBox("Received Event.")End Sub

Class EventClass Public Event XEvent() Public Event YEvent() ' RaiseEvents raises both events. Sub RaiseEvents() RaiseEvent XEvent()

Page 29: Programação orientada a objetos no Visual Basic

RaiseEvent YEvent() End SubEnd ClassA instrução WithEvents e a cláusula Handles geralmente são a melhor opção para manipuladores de eventos pois a sintaxe declarativa usada torna mais fácil de codificar, ler e depurar a manipulação de eventos. No entanto, esteja ciente das seguintes limitações sobre o uso de variáveis WithEvents:

Não é possível usar uma variável WithEvents como um variável de objeto. Ou seja, você

não pode declará-la como Object — você deve especificar o nome da classe quando você

declarar a variável.

Como eventos compartilhados não são ligados a instâncias de classe, você não pode usar

WithEvents para declarativamente manipular eventos compartilhados. Da mesma forma,

você não pode usar WithEvents ou Handles para manipular eventos de um Structure.

Em ambos os casos, você pode usar a instrução AddHandler para manipular esses

eventos.

Não é possível criar matrizes de WithEvents variáveis.

WithEvents variáveis permitem a um único manipulador de eventos manipular um ou

mais tipo de evento, ou um ou mais manipuladores de eventos para manipular o mesmo

tipo de evento.

AddHandler e RemoveHandlerA instrução AddHandler é semelhante à cláusula Handles já que ambas permitem que você especifique um manipulador de eventos. Entretanto, AddHandler usado com RemoveHandler, fornece flexibilidade maior do que a cláusula Handles, permitindo que você adicione, remova e altere dinamicamente o manipulador de evento associado com um evento. Se você quiser manipular eventos compartilhados ou eventos de uma estrutura, você deve usar AddHandler. AddHandler leva dois argumentos: o nome de um evento de um remetente de evento, como um Controlarar e uma expressão que avalia a um delegate. Você não precisa especificar explicitamente a classe representante ao usar AddHandler, desde que a declaração AddressOf sempre retorne uma referência ao representante. O exemplo a seguir associa um manipulador de evento com um evento gerado por um objeto. Visual Basic

Copiar Código AddHandler Obj.XEvent, AddressOf Me.XEventHandlerRemoveHandler, que disconecta um evento de um manipulador de eventos, usa a mesma sintaxe de AddHandler. Por exemplo: Visual Basic

Copiar Código RemoveHandler Obj.XEvent, AddressOf Me.XEventHandler

Como: Adicionar eventos a uma classeAdicionar eventos a uma classe, declarando-os com a instrução Events. A declaração inclui o nome do evento e os argumentos que ele usa. Adicionar um evento a uma classe Especifica que um objeto desta classe pode disparar um evento específico. Para fazer com que um evento ocorra, você deve usar a instrução RaiseEvent. Você pode usar a palavra-chave Handles ou a instrução de AddHandler para associar o evento com um procedimento de manipulador de eventos. Eventos devem ser aumentados dentro do escopo onde elas são declaradas. Por exemplo, um classe derivada não pode disparar eventos herdados de um classe base.

Observação:

Eventos não podem ter valores de retorno, argumentos opcionais, ou Argumentos de ParamArray.

Page 30: Programação orientada a objetos no Visual Basic

Para adicionar um evento a uma classe

Na seção Declarações do módulo classe que define a classe, use instrução de Event

declare o evento quaisquer argumentos você deseja que ele tenha. Por exemplo:

Visual Basic

Copiar Código

Public Event PercentDone(ByVal Percent As Single, _

ByRef Cancel As Boolean)

Como: Criar manipuladores de eventos no Editor de código do Visual BasicO Editor de códigos do Visual Basic oferece uma maneira fácil para criar manipuladores de eventos para o Formulários do Windows. Embora ele não permite conectar vários eventos a um único manipulador de eventos (consulte Como: Conectar-se Múltiplo eventos a um Simples manipulador de eventos do Windows Forms), ele fornece uma maneira rápida e fácil para criar manipuladores de evento enquanto estiver trabalhando no código do formulário sem exibir o formulário na Windows Forms Designer.

Para criar um manipulador de eventos usando o Visual Basic Code Editor

1. Na caixa Editor de códigos,da lista Nome da classe , escolha o formulário ou controle

para que você deseja criar um manipulador de eventos.

2. Da lista Nome do método na parte superior do Editor de códigos, escolha o evento

para que você deseja criar um manipulador de eventos.

Visual Basic cria uma manipulador de eventos e o adiciona à classe do formulário.

Como: Elevar um evento (Visual Basic)Este exemplo define um evento (TimeExpired) e utiliza a instrução RaiseEvent para fazer com que o evento ocorra.  Exemplo

Visual Basic

Copiar Código Public Event TimeExpired(ByVal Status As String)Public Sub RaiseTimeExpiredEvent() RaiseEvent TimeExpired("Your time has run out")End SubEste exemplo de código também está disponível como um trecho de código IntelliSense. No selecionador de trechos de código, ele está localizado em Visual Basic Language. Para obter mais informações, consulte HOW TO: Trechos Inserir em seu código (Visual Basic).  Compilando o código

Este exemplo requer: Acesso aos membros do espaço de nomes System. Adicione uma declaração Imports se

você não está qualificando completamente os nomes de membros em seu código. Para

obter mais informações, consulte Declaração Imports (Tipo e Namespace .NET).

A instrução Event estar no nível de classe e não dentro de qualquer procedimento.

A instrução RaiseEvent pode estar dentro algum procedimento no seu aplicativo.

Page 31: Programação orientada a objetos no Visual Basic

Como: Criar um evento e o manipulador (Visual Basic)Este exemplo define um evento, TimeExpired e um manipulador de eventos, HandleTimeExpired e usa a instrução AddHandler para associá-los.  Exemplo

Visual Basic

Copiar Código Public Event TimeExpired(ByVal Status As String)Public Sub HandleTimeExpired(ByVal Status As String) ' Perform desired processing for when time has expired. MsgBox("HandleTimeExpired caught the TimeExpired event" & _ vbCrLf & "Status = " & Status)End SubPublic Sub SetUpEventHandler() AddHandler TimeExpired, AddressOf HandleTimeExpiredEnd Sub Compilando o código

Este exemplo requer: Acesso aos membros do espaço de nomes System. Adicione uma declaração Imports se

você não está qualificando completamente os nomes de membros em seu código. Para

obter mais informações, consulte Declaração Imports (Tipo e Namespace .NET).

A instrução Event estar no nível de classe e não dentro de qualquer procedimento.

A instrução Event e ambos os procedimentos (HandleTimeExpired e

SetUpEventHandler) a serem definidos na mesma classe ou módulo. Caso contrário, a

instrução AddHandler deve qualificar o evento e o manipulador para os objetos na qual

eles são definidos.

Como: Gravar Eventos manipuladoresO modo como você constrói um manipulador de eventos depende de como você deseja associá-lo com eventos. A maneira padrão para criar um manipulador de eventos é usar a palavra-chave Handles com a palavra-chave WithEvents. Visual Basic fornece um segundo forma de manipular eventos: a instrução AddHandler. AddHandler e RemoveHandler permitem que você dinamicamente Iniciar e parada para um evento específico de manipulação de eventos. Você pode usar qualquer uma das abordagens, mas não deve usar ambas WithEvents e AddHandler com o mesmo evento.  Manipulando Eventos usando WithEvents

A palavra chave WithEvents permite criar variáveis de classe ou objeto de nivel módulo que podem ser usadas com a cláusula Handles em manipuladores de eventos.

Para manipular eventos usando WithEvents e a cláusula Handles

1. Crie uma classe simples que contém um evento

Visual Basic

Copiar Código

Class Class1

Public Event AnEvent(ByVal EventNumber As Integer)

End Class

Page 32: Programação orientada a objetos no Visual Basic

2. Na classe ou módulo que manipulará o evento, use a palavra chave WithEvents para

declarar uma variável objeto para a fonte de seus eventos, como no exemplo seguinte:

Visual Basic

Copiar Código

Public WithEvents ClassInst As Class1

3. No Editor e Código, escolha a variável WithEvents que você acabou de declarar através

da lista Nome da Classe na esquerda.

4. Escolha o evento que deve ser manipulado da lista Nome de Método na direita. O Editor

de Código cria um procedimento manipulador de eventos vazio com uma cláusula

Handles.

Observação:

Esse passo é opcional. Você pode criar o procedimento de manipulador de eventos manualmente desde que o procedimento que você criar uma sub-rotina, tem a lista de argumento correto para coincidir com o evento que está sendo tratado e tem um Cláusula de Handles que especifica o evento sendo manipulado.

5. Adicione o código manipulador de eventos para o procedimento manipulador de eventos

usando os argumentos fornecidos. O código a seguir é um exemplo:

Visual Basic

Copiar Código

Public Sub ClassInst_AnEvent(ByVal EventNumber As Integer) _

Handles ClassInst.AnEvent

MsgBox("Received event number: " & CStr(EventNumber))

End Sub

 Manipulando Eventos usando AddHandler

Você pode usar a declaração AddHandler para dinamicamente conectar eventos com procedimentos manipuladores de eventos.

Para manipular eventos usando AddHandkler

1. Crie uma subrotina para lidar com o evento, como no seguinte exemplo:

Visual Basic

Copiar Código

Public Sub EHandler(ByVal EventNumber As Integer)

MsgBox("Received event number " & CStr(EventNumber))

End Sub

Page 33: Programação orientada a objetos no Visual Basic

2. Declare uma variável objeto da classe que é a fonte dos eventos que você deseja

manipular. Diferentemente da variável WithEvents, isso pode ser uma variável local num

procedimento. Por exemplo:

Visual Basic

Copiar Código

Public Sub TestAddHandler()

Dim CI As New Class1

End Sub

3. Usando a declaração AddHandlerpara especificar o nome do criador do evento, e a

declaração AddressOf para fornecer o nome de seu manipulador de evento. Por exemplo,

adicione o seguinte código ao final da subrotina TestAddHandler:

Visual Basic

Copiar Código

AddHandler CI.AnEvent, AddressOf EHandler

Qualquer procedimento pode servir como um manipulador de eventos desde que ele

suporte os argumentos corretos para o eventos sendo manipulados.

 Usando RemoveHandler para parar de Manipular Eventos

Você pode usar a declaração RemoveHandler para dinamicamente desconectar eventos dos procedimentos manipuladores de eventos.

Para parar manipulação de eventos usando RemoveHandler

Use a declaração RemoveHandler para especificar o nome do criador do evento e a

declaração AddressOf para fornecer o nome do manipulador de evento. A sintaxe das

declarações RemoveHandler será sempre compatível com a declaração AddHandler

usada para começar a manipulação de eventos. Por exemplo:

Visual Basic

Copiar Código

RemoveHandler CI.AnEvent, AddressOf EHandler

 Manipulado Eventos Herdados de uma Classe Base

Derived classes—classes that inherit characteristics from a base class—can handle events raised by their base class using the Handles MyBase statement.

Para manipular eventos de uma classe base

Declare um manipulador de eventos na classe derivada adicionando uma declaração

Handles MyBase.nomedoevento na declaração de seu evento manipulador de eventos,

onde nomedoevento é o nome do evento na classe base manipulada. Por exemplo:

Page 34: Programação orientada a objetos no Visual Basic

Visual Basic

Copiar Código

Public Class BaseClass

Public Event BaseEvent(ByVal i As Integer)

' Place methods and properties here.

End Class

Public Class DerivedClass

Inherits BaseClass

Sub EventHandler(ByVal x As Integer) Handles

MyBase.BaseEvent

' Place code to handle events from BaseClass here.

End Sub

End Class